ios – 比UIImagePNGRepresentation更快地编码PNG吗?

我正在为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平行生成图块可以显着减少时间.

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

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...