AssetBundle詳解與優化

2021-09-28 23:30:07 字數 2971 閱讀 7844

assetbundle是unity中的一種資源包,這種資源包可以是遊戲內要用到的幾乎所有資源,例如:模型、紋理、預設、場景等大部分檔案更新,並且可以在執行時動態載入。

值得注意的是assetbundle是可以多個檔案一起打包,例如將要打包的資源做成預設後再進行打包,這樣可以將預設上面附帶的元件、紋理、子物件等一併打包,載入後直接例項化就能直接使用了(並不是建議大家這麼做,因為涉及的紋理材質可能會造成資源冗餘)。

另外assetbundle 可以選擇壓縮後再進行網路傳輸,提公升傳輸效率,減少包體大小等,不同的壓縮方式,我們放後面對比一下優劣。

那麼使用assetbundle可以解決的問題是:

1.1 實現資源的熱更。

1.2 減少初始包體大小,遊戲可以做分包處理。

1.3  可以利用二進位制檔案做資源加密。

以下我僅作 lzma和lz4的壓縮測試結果進行總結,未壓縮和自定義在此暫不作比較。

2.2 載入開銷。執行時載入開銷lz4要優於lzma不少。

2.3 載入時記憶體占用。在使用loadfromfile(async)載入lzma格式的ab包時,記憶體的占用會是資源檔案記憶體的大約2倍,而使用lz4則是跟資源檔案記憶體大小一致的。

總結是lz4無論是解壓時間、載入開銷和記憶體占用都優於lzma,但唯一的缺點就是包體會大不少(約25%)左右。所以如果想要包體小,且載入速度又快,我們可以使用gzip把資源在打包完之後再打個壓縮包,這樣的話包體也會小很多。

我們從幾種assetbundle本地載入進行比較 new www,assetbundle.loadfromfile對其優劣進行分析比較。

3.1 new www 其優點是即可網路載入又可載入本地,而其缺點是這種方式載入資源,所佔的記憶體要比loadfromfiles高,相比loadfromfile載入速度也會要慢一些。

3.2 assetbundle.loadfromfiles是目前版本最推薦的載入本地assetbundle的方式,從效能上目前是最好的,記憶體占用相比new www也要小。(本地載入www沒有可比性)

assetbundle在使用過程中很容易產生解除安裝不乾淨,繼而導致資源的冗餘,強行解除安裝又可能導致資源丟失引用。如何解除安裝assetbundle是值得深入研究的一件事。

4.1 assetbundle.unload(false)。 引數為false時,assetbundle內的序列化資料會被釋放,例項化的物體還都保持完好。簡單的說就是斷開了assetbundle和例項之間的聯絡。值得注意的是這樣做並不會解除安裝assetbundle,意思是assetbundle還會繼續占用記憶體。然而如果再次例項化物件,也不會返回以前初例化過的assetbundle,而是重新例項化乙個新的assetbundle,那麼這樣就出現了冗餘,同樣的資源,記憶體中會出現多份。所以適合這樣來解除安裝的資源,一定是不需要多次建立例項的資源,例如:一次性使用的配置資訊。而解除安裝的話要當建立的例項刪除**以後,手動呼叫resources.unloadunusedassets或切換場景來釋放。

4.2 assetbundle.unload(true)。引數為true時,就簡單多了,解除安裝assetbundle,並且刪除被引用的資源。注意!如果assetbundle中有資源在場景中被引用,則會出現資源丟失的情況。這種解除安裝方式,最為徹底,完全從記憶體移除,缺點是你需要一套機制,來關注是不是還有資源引用,會不會引起異常。

4.3 關於解除安裝資源中,必須要跟大家說明的是,載入的assetbundle,可以通過resources.unloadunusedassets來釋放。但是前提是載入的assetbundle一定要先釋放乾淨,即沒有任何引用。在呼叫assetbundle.unload(true)後會強行刪除建立的例項和引用;而assetbundle.unload(false),必須先手動刪除資源的例項和引用才能釋放。另外resources.unloadunusedassets的開銷其實並不小(因為不僅僅是釋放assetbundle還包括resources.load的其他資源),建議每隔一段時間進行呼叫比較合適。

那麼給大家總結下使用解除安裝方案吧。

assetbundle.unload(false)適用於一次性使用的資源,獲得資源引用後直接呼叫,當刪除引用後,下次呼叫resources.unloadunusedassets後就刪除了。assetbundle.unload(true)在使用中,最好的做法是給建立出來的例項都新增計數,當計數不為0時,表示場景或**中仍有引用,而當計數為0時,表示沒有引用了,這樣就可以放心大膽的assetbundle.unload(true)了。

依賴打包最需要注意的也是唯一要注意的就是要避免依賴的處理不當,而導致資源冗餘

5.1 對於引用的資源,必須明確出現在其他assetbundle的資源列表中,unity才能識別為依賴關係,形成依賴打包。

5.2 合理規劃assetbundle包,公共的資源單獨抽離打包。

5.3 注意資源與assetbundle的關係,乙個assetbundle可以包含多個資源,但同乙份資源不允許存在於多個assetbundle中。

在打包之前首先要按照資源型別和邏輯進行分組,接下來我們討論下分組,當然這裡只是討論如果要分組的情況,我們也可根據專案實際情況。

因為每個專案在assetbundle分組情況有多種選擇,有些專案甚至選擇的是全顆粒化增量更新的模式。因此該小節暫不作建議和說明。

要檢測資源是否冗餘,推薦使用assetbundles-browser、unitystudio、disunity、uwa got等工具進行檢測。

嗯,以下排名不分先後,都是很好用的開源庫,不過一些特殊功能,例如:加密、assetbundle差異合併、打包策略等,還需要根據具體的專案加以實現。

monsterabsystem

absystem

ksframework

xasset

zcode-assetbundlepacker

以上開源庫均可在github上搜到。

AssetBundle詳解與優化

assetbundle是unity中的一種資源包,這種資源包可以是遊戲內要用到的幾乎所有資源,例如 模型 紋理 預設 場景等大部分檔案更新,並且可以在執行時動態載入。值得注意的是assetbundle是可以多個檔案一起打包,例如將要打包的資源做成預設後再進行打包,這樣可以將預設上面附帶的元件 紋理 ...

AssetBundle詳解與優化

assetbundle是unity中的一種資源包,這種資源包可以是遊戲內要用到的幾乎所有資源,例如 模型 紋理 預設 場景等大部分檔案更新,並且可以在執行時動態載入。值得注意的是assetbundle是可以多個檔案一起打包,例如將要打包的資源做成預設後再進行打包,這樣可以將預設上面附帶的元件 紋理 ...

Assetbundle建立與載入

assetbundle建立與載入 unity有兩種動態載入機制 一種是resource.load。一種是assetbundle。assetbundle是unity pro提供的功能,它可以把多個遊戲物件或者資源二進位制檔案封裝到assetbundle中。供載入 解壓使用。建立assetbundle ...