मेरे ऐप में मैं एक छवि मैपिंग फ्लोट को पिक्सेल मान पर बना रहा हूं और इसे Google मानचित्र पर ओवरले के रूप में उपयोग करता हूं, लेकिन यह हमेशा के लिए होता है, एंड्रॉइड में एक ही चीज़ लगभग तुरंत है। मेरा कोड इस तरह दिखता है:स्विफ्ट में चित्रकारी छवि हमेशा के लिए लेती है
private func imageFromPixels(pixels: [PixelData], width: Int, height: Int) -> UIImage? {
let bitsPerComponent = 8
let bitsPerPixel = bitsPerComponent * 4
let bytesPerRow = bitsPerPixel * width/8
let providerRef = CGDataProvider(
data: NSData(bytes: pixels, length: height * width * 4)
)
let cgimage = CGImage(
width: width,
height: height,
bitsPerComponent: bitsPerComponent,
bitsPerPixel: bitsPerPixel,
bytesPerRow: bytesPerRow,
space: CGColorSpaceCreateDeviceRGB(),
bitmapInfo: CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedFirst.rawValue),
provider: providerRef!,
decode: nil,
shouldInterpolate: true,
intent: .defaultIntent
)
if cgimage == nil {
print("CGImage is not supposed to be nil")
return nil
}
return UIImage(cgImage: cgimage!)
}
इस पर कोई सुझाव देने में कितना समय लग सकता है? मैं देख सकता हूं कि यह लगभग 96% सीपीयू पावर का उपयोग करता है।
func fromData(pair: AllocationPair) -> UIImage? {
let table = pair.table
let data = pair.data
prepareColors(allocations: table.allocations)
let height = data.count
let width = data[0].count
var colors = [PixelData]()
for row in data {
for val in row {
if (val == 0.0) {
colors.append(PixelData(a: 0, r: 0, g: 0, b: 0))
continue
}
if let interval = findInterval(table: table, value: val) {
if let color = intervalColorDict[interval] {
colors.append(PixelData(a: color.a, r: color.r, g: color.g, b: color.b))
}
}
}
}
return imageFromPixels(pixels: colors, width: width, height: height)
}
मैंने इसे प्रोफ़ाइल करने का प्रयास किया है, और यह वह आउटपुट है जहां इसमें समय लगता है।
असल में मैं सिर्फ मिश्रित या तो हरे, लाल या पीले रंग पिक्सल के साथ एक तस्वीर दिखा रहा हूँ – Recusiwe
क्या आप वाकई समस्या है यहाँ और नहीं '[PixelData]' सरणी के निर्माण में कर रहे हैं? डीबग बिल्ड में, बड़े सरणी में हेरफेर करना बहुत धीमा है। यदि आप ऑप्टिमाइज़ेशन के साथ रिलीज बिल्ड करते हैं, तो बड़े सरणी का उपयोग करना बहुत तेज़ है। सुनिश्चित करें कि समस्या उस सरणी के निर्माण में है और नहीं। और फिर, ज़ाहिर है, सुनिश्चित करें कि जब आप छवि को दिखाते हैं कि आप मुख्य कतार पर ऐसा कर रहे हैं। – Rob
@Recusiwe, क्या आपने यह निर्धारित करने के लिए इंस्ट्रूमेंट्स का उपयोग करने की कोशिश की है कि सभी सीपीयू खर्च किए जा रहे हैं? आप इस ट्यूटोरियल से शुरू करने का प्रयास कर सकते हैं: https://www.raywenderlich.com/97886/instruments-tutorial-with-swift-getting-started –