我正在为CATiledLayer生成一堆tile.在iPhone 4S上,以256 x 256的四层细节生成120张拼图大概需要11秒钟.图像本身适合2048 x 2048.
我的瓶颈是UIImagePNGRepresentation.生成每256×256图像大约需要0.10-0.15秒.
我已经尝试在不同的后台队列上生成多个图块,但这只能将其缩小到大约9-10秒.
我也尝试过使用像这样的代码的ImageIO框架:
- (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); }
虽然这产生较小的PNG文件(win!),但它需要大约13秒,比以前更多2秒.
有没有办法从CGImage更快地编码PNG图像?也许使用NEON ARM扩展(iPhone 3GS)的图书馆,如libjpeg-turbo?
有没有比PNG更好的格式来保存不占用大量空间的瓷砖?
我可以想到的唯一可行的选择是将平铺尺寸增加到512 x 512.这将编码时间缩短一半.不知道该怎么做,我的滚动视图.该应用程序适用于iPad 2,仅支持iOS 6(使用iPhone 4S作为基准).
解决方法
事实证明,UIImageRepresentation表现如此糟糕的原因是因为它每次解压缩原始图像,即使我以为我正在使用CGImageCreateWithImageInRect创建一个新的图像.
您可以在这里看到仪器的结果:
注意_cg_jpeg_read_scanlines和decompress_onepass.
我用强制解压缩图像:
UIImage *image = [UIImage imageWithContentsOfFile:path]; UIGraphicsBeginImageContext(CGSizeMake(1,1)); [image drawAtPoint:CGPointZero]; UIGraphicsEndImageContext();
这个时间约为0.10秒,几乎相当于每个UIImageRepresentation电话所用的时间.
有一篇关于Cocoanetics 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,(__bridge CFDictionaryRef)dict); UIImage *image = [UIImage imageWithCGImage:cgImage]; CGImageRelease(cgImage); CFRelease(source);
现在相同的过程大约需要3秒!使用GCD平行生成图块可以显着减少时间.