任何方式来编码PNG比UIImagePNGRepresentation更快?

我正在为CATiledLayer生成一堆瓷砖。 大约需要11秒,在iPhone 4S上生成256个256个细节的120个贴图。 图像本身适合2048 x 2048。

我的瓶颈是UIImagePNGRepresentation 。 生成每个256 x 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文件(胜利!),它需要约13秒,比以前多2秒。

有什么办法来更快地从CGImage编码PNG图像? 也许一个像libjpeg-turbo那样使用NEON ARM扩展(iPhone 3GS +)的库呢?

有没有比PNG更好的格式来节省不占用大量空间的瓷砖?

我已经能够提出的唯一可行的select是将拼贴大小增加到512 x 512.这将编码时间减less了一半。 不知道这将做我的滚动视图。 该应用程序是为iPad 2 +,只支持iOS 6(使用iPhone 4S作为基准)。

事实certificate,为什么UIImageRepresentation执行得如此糟糕的原因是因为它每次都解压缩原始图像,即使我以为我正在用CGImageCreateWithImageInRect创build一个新的图像。

你可以在这里看到仪器的结果:

在这里输入图像说明

注意_cg_jpeg_read_scanlinesdecompress_onepass

我用这个强制解压缩图像:

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

这个时间约为0.10秒,几乎相当于每个UIImageRepresentation调用所花费的时间。

在互联网上有很多文章推荐绘图作为强制解压缩图像的方式。

有一篇关于Cocoanetics 避免图像减压病的文章。 本文提供了加载图像的替代方法:

 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秒钟! 使用GCD并行生成切片可以大大缩短时间。

上面的writeCGImage函数大约需要5秒钟。 由于文件大小较小,我怀疑zlib压缩处于更高的水平。