Unity匯出ios工程如何減小運行記憶體、安裝包(ipa)、以及安裝後大小(概說)
最近項目遇到些問題,就是因為項目裡面彩色圖片素材比較多,尺寸也比較大,製作人還不接受把壓縮圖片品質降低很明顯。於是導致unity匯出到ios裝置上出現了幾個問題。
1、 運行記憶體過大;在低配版的iphone4s,ipad2等512m老機型機器上面,當載入資源過多時,容易引起記憶體溢出,導致應用閃退。
2、 Unity匯出的ios工程過大,xcode編譯出來的ipa包還算ok,但是安裝到ios裝置上就大的離譜。例如60m的ipa,安裝到裝置上居然有700M。
3、 就是ipa匯出包偏大。要求盡量減小到本身資源+unity空包(七八兆)左右大小。
以上問題,1、2屬於比較嚴重的問題。3 屬於進一步最佳化的問題。
針對上述問題我們採取了一系列方案,下面就其解決方案簡單闡述,所述不周之處還請指正。
一、減少程式運行記憶體,更好相容低記憶體機器
程式記憶體消耗過大,導致記憶體溢出,大多由於資源一次性載入過多,或者未及時清理,根源在於資源過大。
1、首先,對於資源過大的問題:
音頻:我們可以盡量採用ogg格式,低採樣率的音頻代替wav、MP3等高採樣率音頻。採樣率低也就代表著音頻品質低,你可以利用音頻轉換軟體,將音頻調整到可以接受的品質。
圖片:如果需要較高品質,可多採用jpg格式,如果對品質沒過多要求,可以儲存為web格式。如果有透明色那就只能png了。
這裡推薦一個圖片壓縮網站,基本上處理後,他的壓縮率會達到50%以上,而且看不出有太多的失真。
https://tinypng.com/
2、其次,當我們將資源匯入unity中,unity會對資源做一些特殊的處理,例如圖片在web平台下,預設會使用texture、compressed壓縮。此時,jpg格式或者大體成2的n次方的png圖片幾乎都可以被壓縮。
之前,我們為了圖片效果完美,一直用:gui、truecolor格式圖片,這樣確實在裝置上畫面表現很好。
但是這樣就導致一個問題,一張原本只有87k大小的圖片,使用這個設定後會被渲染變得4m大小。
當運行程式時,它所佔據的記憶體就為4m,而非87k。尤其是我們項目中,一個介面中有很多這種高品質圖片,而且再加上有很多序列幀動畫,並且這個動畫單張比較大,幀數還比較多。那這個記憶體佔據就非常可怕了。我們的低配置機器僅僅512記憶體,如果不合理編寫資源管理員。那崩潰的幾率確實很大。
因此我們實驗了幾種不同圖片格式,在ios裝置上,pvrtc 4bit 這種格式的圖片相對來說,記憶體佔據量不算高,也不是很失真。不建議追求極致的圖片品質,而消耗很大的記憶體。
3、然後我們使用了動態資源載入。
將一系列資源(圖、圖集的預設)打包成為assetbundle,將其放置在唯讀目錄StreamingAssets檔案夾下。
當使用這個資源時,利用www讀取本地資源,載入到記憶體。
然後馬上卸載掉鏡像。
當不再使用這個資源時即銷毀這個對象。
但是,實際測試在真實ios裝置上記憶體監測到的並非立刻降低,因此這個情境中如果資源需要比較多,還不能全部加再進來。而是要根據需要分批次載入進來。
此外在情境切換過程中還需要經常調用系統函數Resources.UnloadUnusedAssets();來清理一下 游離的未使用 資源。以保證記憶體回收。
4、資源打包這裡不再詳細敘述。詳細可以參考以下內容:
http://www.xuanyusong.com/archives/2405
注意的是單獨寫指令碼時,注意最後打包參數。不同平台打出的資源不通用。
Android上:
BuildPipeline.BuildAssetBundle(obj, null, targetPath,BuildAssetBundleOptions.CollectDependencies,BuildTarget.Android)
IOS上:
BuildPipeline.BuildAssetBundle(obj, null, targetPath,BuildAssetBundleOptions.CollectDependencies,BuildTarget.iPhone)
另外,電腦上和手機上打出來的Assetbundle不能混用,不同平台只能用自己的。
5、其實,資源打包針對於記憶體最佳化的影響並不是很大。影響大的是資源使用的格式、數量的多少。以及對資源使用的管理。
不過,資源打包也有不少好處。就是:1、資源的加密型比較好;2、可以很大的減小安裝到手機上面的用量。3、載入、銷毀比較清晰,可控性較好。4、載入未完成時可以了利用loading介面遮蓋,防止介面轉換時閃黑屏。
二、ipa包匯出後安裝到真機上佔據空間巨大
1、我們的項目在開始時,並沒有多少資源師打成Assetbundle的形式的。至少情境、序列幀動畫開始的時候都沒有打。
後來就遇到了這個問題:
1、 我們在windows上編譯出xcode工程時,發現居然有700多m,覺得很奇怪,檢查了一下,有個data的檔案夾 比較大。
2、 整個工程打成zip壓縮包僅僅100m
3、 然後又在mac上面編譯出來的工程居然又達到700m
4、 製作出來的ipa檔案卻又不太大,60m左右
5、 但是安裝到真機上,軟體用量卻十分大,大約700多m
2、針對這個問題我們研究發現,主要是資源檔夾下resourcedata,再經過調查,是因為裡面的圖片的問題。
3、當初為了保證圖片高品質,無論jpg還是png,我們都採用了gui、truecolor的設定。
在上面實驗中、87k大小的檔案,被渲染成4m左右大小的資源。
我們通過解壓發現,編譯安裝後,ios沒有做到很好的壓縮與支援,而是將這個圖片直接轉換成tga格式儲存。這就導致佔據用量巨大。
4、也就是說:運行時他佔據4m記憶體
安裝時他也同樣佔據著4m的硬碟用量
5、針對於此,我們首先將圖片格式轉換成上述ios支援比較好的pvrtc 4bit 形式。
但是這種格式也有缺點,就是需要觀察哪些可以壓縮,那些不能壓縮。經實驗,接近2的n次方的近似方形的圖片或者圖集能夠壓縮,而不會圖片變形。經過這樣的處理我們的用量初步降低為300m。
6、然後我們發現僅僅將資源打包還不夠,剩下的介面、情境等的預設上面還關聯了很多的圖片以及圖集。如果情境不打包讓然會有很大的用量。於是我們將情境進一步打包。除了攝像機的預設,全部打包。這樣我們的用量徹底降低了下來,大約有80m多。
7、這種方式不適用初期開發,因為每當修改一次預設或者調整介面,都要重新打包。並修改資來源目錄。著實費力。
8、在實驗中,還發現。預設、圖片打包後,就不能仍舊放在Resource目錄下,否則即使你不再引用,他依然能夠編譯到工程裡面去,從而不會減小最終產出的工程。