一.寫在前面
通過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數量.
四.源碼