[Unity]淺談AssetBundle的依賴關系打包與加載


.寫在前面

  通過AssetBundle進行資源管理很方便.對AssetBundle打包時,可以自由決定打包的粒度.將所有單個資源打包成單個bundle自然簡單方便,但是卻會造成bundle數目過多.本文介紹的是一種依賴關系打包的策略.希望能最大限度的減少bundle數量不加載冗余資源.

   若對AssetBundle沒有了解,可以先閱讀:Unity動態加載和內存管理(三合一)

.策略介紹

  1.打包的粒度划分的策略

    ①     所有在指定目錄下的文件,即RootList,都被打包成單獨結點

    ②     對於RootList所依賴的所有資源,即DepList,依賴數大於1的,被打包成單獨結點,等於1的,向上合並至被依賴結點.

    ③     記錄打包信息 

  

圖例

  2.下載策略

    ①     下載配置文件

    ②     更新AssetBundle文件 

  3.加載的策略

    程序所有的AssetBundle信息都已經被記錄在了文檔之中,每次啟動游戲的時候,讀取配置文檔,並將每一個AssetBundle文件的信息存儲在一個對應的AssetBundleHint對象中,Hint(即AssetBundleHint,下同)類記錄Bundle的加載信息和引用情況.

    ①     資源所對應的Hint不存在,報告不存在異常,若存在轉下

    ②     Hint引用數增加,依賴的Hint引用數增加

    ③     若Hint內Bundle為空,加載Bundle,並加載依賴的Hint中未加載的Bundle

    ④     若Hint內MainAsset為空,加載MainAsset

    ⑤     返回Hint內MainAsset

  4.釋放策略

    ①     資源所對應的Hint不存在,報告不存在異常,若存在轉下

    ②     所有依賴的Hint引用數減1,對應的Hint引用數減1

    ③     若Hint為引用數為0時, 置空MainAsset,並對Bundle調用Unload(true)

 

.注意

       1.AssetBundle在加載自身內Asset時,需要保證所以來的資源都在此Bundle內或者在其它被加載上來的AssetBundle中才能保證加載完全正確.

       2.打包資源時可以要有過濾,將不打包的的類型或者指定資源濾出.

       3.可拓展:記錄文件MD5變化(通過git或者svn的改動變化監聽即可),進行增量打包.

  4.本方式可以最大程度上減少AssetBundle本身的加載資源內存占用,但是會增加AssetBundle數量.

 

 四.源碼

  MonsterABSystem


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM