将PNG添加到XCode iPhone项目时,编译器会使用pngcrush对其进行优化.一旦在设备上,图像的渲染性能非常快.
我的问题是我的应用程序在运行时从外部源下载PNG(使用Google Data API从Picasa网络相册中下载).不幸的是,这些图像的表现非常糟糕.当我在图像上进行自定义渲染时,它似乎比内部存储的对应物慢100倍.我强烈怀疑这是因为下载的图像尚未优化.
有谁知道如何在iPhone上运行时优化外部下载的PNG?我希望有一个班级能做到这一点.我甚至考虑将pngcrush的源代码添加到我的应用程序中,这似乎很激烈.我自己一直无法找到合适的答案.我会非常感谢任何帮助.
谢谢!
更新:有些人建议可能是由于文件的大小,但事实并非如此.在我的测试中,我添加了一个切换按钮,在使用嵌入版本和完全相同的PNG的下载版本之间切换.唯一的区别是嵌入的一个在编译期间由'pngcrush'优化.这会进行一些字节交换(从RGBA到BRGA)和alpha的预乘.(http://iphonedevelopment.blogspot.com/2008/10/iphone-optimized-pngs.html)
另外,我所指的性能不是下载,而是渲染.我在图像顶部叠加自定义绘画(覆盖UIView的drawRect方法),当背景是下载版本时它非常不连贯,当它是嵌入(因此优化)版本时非常平滑.同样,它是完全相同的文件.唯一的区别是优化,我希望我可以在运行时,在设备上,在下载之后对图像执行.
再次感谢大家的帮助!
您发布的链接几乎可以回答您的问题.
在构建过程中,XCode会预处理您的png,因此它的格式对iPhone中的图形芯片更友好.
没有像这样处理过的Png可能会使用较慢的渲染路径,一个处理非原生格式的路径,以及必须为每种颜色单独计算alpha的事实.
所以你有两个选择;
执行与pngcrush相同的工作并交换排序/预乘alpha.加速可能是由于这些中的一个或两个.
加载图像后,可以从中"创建"新图像.这个新图像应该是iPhone的原生格式,所以应该更快.缺点是它可能会占用更多的内存.
例如
CGRect area = CGRectMake(0, 0, width, height); CGSize size = area.size; UIGraphicsBeginImageContext(size); [oldImage drawInRect:area]; UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext();