Unity匯出ios工程如何減小運行記憶體、安裝包(ipa)、以及安裝後大小

來源:互聯網
上載者:User
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目錄下,否則即使你不再引用,他依然能夠編譯到工程裡面去,從而不會減小最終產出的工程。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.