1. 程式人生 > >Unity Assetbundle的載入方式的效率和記憶體佔用

Unity Assetbundle的載入方式的效率和記憶體佔用

一,三載入的Assetbundle檔案物件22.2MB,unity自帶壓縮的ab檔案
二載入的Assetbundle檔案物件52.2MB,未使用unity自帶壓縮

url/path指定的路徑要求是Assetbundle檔案,不要對Assetbundle再進行加密壓縮的,搞的unity認不出。
以下方法用的Assetbundle都是已經下載到本地SD卡再讀取的

. 載入方式 開始load到生成Assetbundle時間 記憶體Used Total變化
WWW.LoadFromCacheOrDownload(string url, int version) 0.084s 51.6M-78.9M-104M
Assetbundle.CreateFromFile(string path) 0.012s 52M-78M-103M
Assetbndle.CreateFromMemory(byte[] bs) 2.599s 51M-108M-195M-217M

一,WWW.LoadFromCacheOrDownload(string url, Int version):
非同步方法
開始load到生成Assetbundle時間:0.084s
記憶體Used Total變化:51.6M-78.9M-104M

這個方法簡單方便,效率不錯,而且載入時佔記憶體少,我沒明白它把快取存到哪個路徑了。有人 說使用這個方法更新有時出現失敗的情況,但我沒遇到過。對於有資源更新需求的建議還是自己定義更新版本號。對於這種讓人封裝得比較“完美”的方法,我覺得並非很多人都喜歡。

二,Assetbundle.CreateFromFile(string path)
非非同步方法,

unity官方文件上說最快的載入Assetbundle方式。
從指定路徑開始load到生成Assetbundle時間:0.012s
記憶體Used Total變化:52M-78M-103M

注意:這裡的url指定的Assetbundle要求是沒有壓縮過的,此方法也只能載入未壓縮過的,就是打包ab時選擇不壓縮。
這個方法載入效率高,記憶體佔用低,推薦使用,只是使用未經過unity壓縮的Assetbundle,但下載或打包進StreammingAssets時我們可以自己壓縮。雖然如此,但最後還是得解壓到手機SD卡,佔用一定的手機SD卡空間。

三,Assetbndle.CreateFromMemory(byte[] bs)
傳入unity自身壓縮過的Assetbundle檔案的位元組,
從指定路徑開始load到生成Assetbundle時間:2.599s,(太大,直接停在這一幀了)
記憶體Used Total變化:51M-108M-195M-217M

這個方法先把Assetbundle檔案的位元組載入進記憶體,再從這些位元組生成Assetbundle,最後導致載入時間漫漫,記憶體使用飆升。他的好處是可以對位元組進行處理,就是加密,這樣就可以對手機SD卡中的Assetbundle檔案進行加密也能夠使用了。

以上的記憶體最高值只是某一時刻的
當然,引用完Assetbundle後要使用Unload進行釋放。

如果覺得呼叫Unload(false)沒什麼效果,試試:
引用至jesse_luzexi的部落格:

這是U3D沒有處理好的一個環節。在WWW載入資源完畢後,對資源進行instantiate後,對其資源進行unload,這時問題就發生
了,instantiate處理渲染需要一定的時間,雖然很短,但也是需要1,2幀的時間。此時進行unload會對資源渲染造成影響,以至於沒有貼圖或
者等等問題發生,等待個0.5秒到1秒之後再進行Unload。這樣就不會出現instantiate渲染中就執行unload的情況了。