Tianran Ding

Feb 17, 2012 - 1 minute read - Comments - iOS Develop

PNG 与 iOS 优化选项

从App Store下载到的每一枚App最初都是一只IPA文件(其实是zip格式,内含特定规则的文件夹组织方式)。但当作zip解开之后会发现里面很多的PNG文件看不了,这是因为在这些PNG图像都已被iOS开发工具「优化」过了。

Bjango.com的一篇文章提到了不管开发者事先对PNG做了何种优化(例如优化色彩范围这种),最终得到的结果都是一样的文件尺寸-因为Xcode编译后把所有PNG都按自己的方式再处理了。

苹果究竟要对每个PNG做了什么?为啥呢。

苹果的提供的开发者文档以及各种会议/视频中,从最开始就提倡尽量多的使用PNG格式的图片,说了iOS仅对PNG格式有优化。所得结果也是这样,最后的文件尺寸也变小了。可是仅仅使文件尺寸变小就有这么值得说一说的吗。

后来10年有一份Q&A文档里又提到了一个Xcode包含的小工具pngcrush可以使“iPhone-optimized PNG file to a standard PNG file”(主要是因为有开发者提问了为啥PNG文件都看不了啊啊啊)。

还有人发现,标准的24bit PNG文件存储方式是按照顺序(红/绿/蓝/透明度)这样来存每一个像素,即RGBA,而经过Xcode优化之后的PNG文件像素顺序变成了BGRA,这样的非标准的PNG文件在一般操作系统也就没办法读了。苹果这么做是有原因的,在OpenGL的wiki有一篇文章 提到了绝大部分GPU的图像/纹理显存每个单元都是24bit的,RGBA和BGRA都有,但BGRA是主流的。这样就说得通了:苹果为了减少图像运算时花在数据交换(从文件系统到显示出来)的时间,运用了类似DMA的原理,图形数据可以在总线里直接走而不用花掉CPU的时间去协助处理。

这点真的是超大的优点,不仅文件尺寸会小,也为iOS爽滑的操作感提供了很强的支援。但文件尺寸也变小了我还不知是做了其他什么优化处理(-_-|||),应该是一些对PNG文件格式的优化算法吧。

这个PNG优化选项在Xcode项目里是个开关,可以关掉和打开,默认打开,没有特殊情况推荐打开它。


最近系统升级10.7.3之后给Xcode带来一个新Bug,我觉得与这个有某种关联。在提交iOS App到App Store的过程中有个步骤是打包完了要Validate一下才能上传,这个Bug就是导致每次都Validate不过去,提示图标Icon.png的尺寸是0x0不符合标准,但实际上这个png其实是没问题的。在搜索之后发现有人找到临时解决方法是把Compress PNG关掉,这样就OK了,Xcode可以通过Validate成功提交,但这对文件尺寸和运行效率是有负面影响的。之后又有人发现重装一下Application Loader也能解决这个问题。

###参考资料: http://www.opengl.org/wiki/Common_Mistakes http://bjango.com/articles/pngcompression/ http://developer.apple.com/library/ios/#qa/qa1681/_index.html