从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

后记:

OSX10.8之后系统自己会识别特别PNG,所以不管什么PNG都可以正常显示,与Xcode无关

PNG与iOS优化选项的更多相关文章

  1. gcc 优化选项 -O1 -O2 -O3 -Os 优先级

    http://hi.baidu.com/xiaole10368/item/7cea9b1369cc240db88a1a5c 少优化->多优化: O0 -->> O1 -->&g ...

  2. 警惕arm-linux-gcc编译器优化选项

    arm-linux-gcc的优化选项例如(-O2),可以加速我们的程序,使程序执行效率更高.但是,倘若我们就是需要程序慢一点运行,但是优化却把我们的延时函数优化的没有了的时候,这种优化却不是我们想要的 ...

  3. GCC优化选项-fomit-frame-pointer对于esp和ebp优化的作用

    我的博客:www.while0.com -fomit-frame-pointer选项是发布产品时经常会用到的优化选项,它可以优化汇编函数中用edp协助获取堆栈中函数参数的部分,不使用edp,而是通过计 ...

  4. 不同优化选项对ARM下C语言编译的影响

    我们知道在C语言编译时,有那么几个常用的优化编译选项,分别是-O0,-O1,-O2,-O3以及-Os.之前一直觉得既然是优化选项,顶多是优化一下逻辑,提高一些效率或者减少一下程序大小而已.很少会觉得它 ...

  5. g++优化选项

    g++优化选项 g++优化选项 对于下面的这段代码: 1 2 3 4 5 6 7 8 9 10 11 12 #include <iostream> using namespace std; ...

  6. gcc 优化选项 -O1 -O2 -O3 -Os 优先级,-fomit-frame-pointer

    英文:https://gcc.gnu.org/onlinedocs/gcc-3.4.6/gcc/Optimize-Options.html#Optimize-Options 少优化->多优化: ...

  7. gcc -O0 -O1 -O2 -O3 四级优化选项及每级分别做什么优化【转】

    转自:http://blog.csdn.net/qinrenzhi/article/details/78334677 相关博客http://blog.chinaunix.net/uid-2495495 ...

  8. 浮点优化选项 -ffast-math:极大地提高浮点运算速度【转】

    转自:http://blog.csdn.net/zjujoe/article/details/2604157 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 关于浮点优化选项摘 ...

  9. 多核服务器的JVM优化选项(转载)

    原文链接 现在多核CPU是主流.利用多核技术,可以有效发挥硬件的能力,提升吞吐量,对于Java程序,可以实现并发垃圾收集.但是Java利用多核技术也带来了一些问题,主要是多线程共享内存引起了.目前内存 ...

随机推荐

  1. 关于ImageLoader的详细介绍

    转载请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/26810303),请尊重他人的辛勤劳动成果,谢谢! 相信大家 ...

  2. SAP常用命令及BASIS操作

    Pfcg         角色,权限参数文件配置Su53        查看权限对象  st01  跟踪St22         看dump,以分析错误  eg.找到ABAP程序出错的地方,找出fou ...

  3. 为什么使用 Bootstrap?

    为什么使用 Bootstrap? 移动设备优先:自 Bootstrap 3 起,框架包含了贯穿于整个库的移动设备优先的样式. 浏览器支持:所有的主流浏览器都支持 Bootstrap.      容易上 ...

  4. Java in a Nutshell学习笔记

    1, bytecode永远是大段 2,其它语言要在java里运行,要么实现类似于javac的编译器,把该语言解释成为class文件.要么,直接重新实现JVM,直接解释该语言3,Java和C++区别: ...

  5. K2BPM怎么让金融数据更有意义?

    西南证券成立于1999年,是唯一一家注册地在重庆的全国综合性证券公司,也是中国第九家上市证券公司和重庆第一家上市金融机构.公司现有员工逾2000名,在全国27个省份获批设立109家证券营业部,拥有17 ...

  6. jquery Mobile弹出窗

    先创建一个窗体 <div data-role="popup" id="popupView" class="ui-content" da ...

  7. php 判断复选框checkbox是否被选中

    php 判断复选框checkbox是否被选中   复选框checkbox在php表单提交中经常被使用到,本文章通过实例向大家介绍php如何判断复选框checkbox中的值是否被选中,需要的朋友可以参考 ...

  8. java 代码的细节优化

    前言 代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑 的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用 ...

  9. 如何加载JS

    外部JS的阻塞下载 所有浏览器在下载JS的时候,会阻止一切其他活动,比如其他资源的下载,内容的呈现等等.至到JS下载.解析.执行完毕后才开始继续并行下载其他资源并呈现内容. 有人会问:为什么JS不能像 ...

  10. svn Q&A

    Q1:在svn commit的时候,会出现某某文件 is missing.这是因为此次提交时:远程repository中并没有该文件,而且本地repository也没有该文件. 具体原因: 1.可能因 ...