從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無關