12

मैं CATiledLayer के लिए टाइल्स का एक गुच्छा उत्पन्न कर रहा हूं। आईफोन 4 एस पर विस्तार के 4 स्तरों के साथ 256 x 256 पर 120 टाइल्स उत्पन्न करने में लगभग 11 सेकंड लगते हैं। छवि स्वयं 2048 x 2048 के भीतर फिट बैठती है।UIImagePNGRepresentation की तुलना में एक पीएनजी को तेज़ी से एन्कोड करने का कोई तरीका?

मेरी बाधा UIImagePNGRepresentation है। प्रत्येक 256 x 256 छवि उत्पन्न करने में लगभग 0.10-0.15 सेकंड लगते हैं।

मैंने विभिन्न पृष्ठभूमि कतारों पर एकाधिक टाइल्स जेनरेट करने का प्रयास किया है, लेकिन यह केवल 9-10 सेकेंड तक इसे घटा देता है। हालांकि इस छोटे PNG फ़ाइलें (! जीत), इसके बारे में 13 सेकंड, 2 सेकंड पहले की तुलना में अधिक लेता है पैदा करता है

- (void)writeCGImage:(CGImageRef)image toURL:(NSURL*)url andOptions:(CFDictionaryRef) options 
{ 
    CGImageDestinationRef myImageDest = CGImageDestinationCreateWithURL((__bridge CFURLRef)url, (__bridge CFStringRef)@"public.png", 1, nil); 
    CGImageDestinationAddImage(myImageDest, image, options); 
    CGImageDestinationFinalize(myImageDest); 
    CFRelease(myImageDest); 
} 

:

मैं भी इस तरह के कोड के साथ ImageIO ढांचे का उपयोग कर की कोशिश की है।

क्या CGImage से पीएनजी छवि को एन्कोड करने का कोई तरीका है? शायद NEON एआरएम एक्सटेंशन (आईफोन 3 जीएस +) जैसे libjpeg-turbo का उपयोग करने वाली लाइब्रेरी का उपयोग करता है?

क्या संभवत: पीएनजी से बेहतर टाइल बचाने के लिए बेहतर प्रारूप है जो बहुत अधिक जगह नहीं लेता है?

एकमात्र व्यवहार्य विकल्प मैं टाइल आकार को 512 x 512 तक बढ़ाने के लिए सक्षम हूं। यह एन्कोडिंग समय को आधे से घटा देता है। यकीन नहीं है कि मेरे स्क्रॉल व्यू के साथ क्या होगा। ऐप आईपैड 2+ के लिए है, और केवल आईओएस 6 का समर्थन करता है (बेसलाइन के रूप में आईफोन 4 एस का उपयोग करके)।

उत्तर

4

यह कारण है कि UIImageRepresentation इतना खराब प्रदर्शन कर रहा था, क्योंकि यह मूल छवि हर बार भी मैं हालांकि सोचा मैं CGImageCreateWithImageInRect के साथ एक नई छवि बनाने गया था decompressing था पता चला है।

आप उपकरण यहां से परिणाम देख सकते हैं:

enter image description here

सूचना _cg_jpeg_read_scanlines और decompress_onepass

UIImage *image = [UIImage imageWithContentsOfFile:path]; 
UIGraphicsBeginImageContext(CGSizeMake(1, 1)); 
[image drawAtPoint:CGPointZero]; 
UIGraphicsEndImageContext(); 

इस के समय 0.10 सेकंड, समय प्रत्येक UIImageRepresentation कॉल द्वारा उठाए के लगभग बराबर था:

मैं इस के साथ छवि बल decompressing था।

इंटरनेट पर कई लेख हैं जो छवि को डिकंप्रेस करने के बल के रूप में चित्रकारी की अनुशंसा करते हैं।

कोकोनेटिक्स Avoiding Image Decompression Sickness पर एक लेख है। यह लेख छवि लोड करने का एक वैकल्पिक तरीका प्रदान करता है:

NSDictionary *dict = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] 
               forKey:(id)kCGImageSourceShouldCache]; 
CGImageSourceRef source = CGImageSourceCreateWithURL((__bridge CFURLRef)[[NSURL alloc] initFileURLWithPath:path], NULL); 
CGImageRef cgImage = CGImageSourceCreateImageAtIndex(source, 0, (__bridge CFDictionaryRef)dict); 
UIImage *image = [UIImage imageWithCGImage:cgImage]; 
CGImageRelease(cgImage); 
CFRelease(source); 

और अब एक ही प्रक्रिया में लगभग 3 सेकंड लगते हैं! समानांतर में टाइल्स उत्पन्न करने के लिए जीसीडी का उपयोग करना समय को और अधिक महत्वपूर्ण बनाता है।

writeCGImage फ़ंक्शन ऊपर 5 सेकंड लेता है। चूंकि फ़ाइल आकार छोटे हैं, मुझे संदेह है कि ज़्लिब संपीड़न उच्च स्तर पर है।

संबंधित मुद्दे