Unity3d AssetBundle依賴關係理解

AssetBundle(簡稱AB包)打包方式:

[@MenuItem("AB/Build AB")]
        public static void BuildAB()
        {
            BuildPipeline.BuildAssetBundles(Application.dataPath, BuildAssetBundleOptions.UncompressedAssetBundle,
                BuildTarget.StandaloneWindows64);
        }

AssetBundle的三種壓縮方式:

  1. LZMA(一種序列化流文件):U3D默認壓縮格式,使用前需解壓,高壓縮比但是需要時間
  2. LZ4:壓縮比一般但是解壓時間快,Option是ChunckBasedCompression
  3. 不壓縮:速度最快,Option是UncompressdAssetBundle(自己的compress)

通俗理解依賴: 當一個AB包package1裏面的資源引用了其他AB包package2裏面的資源時,我們稱package1依賴於package2,也就是說沒有package2的話,package1會出錯。

爲什麼要理解依賴:

  1. 平時使用AB包開發時,如果一個包依賴於其他包,則必須先把依賴包先加載後才能正常加載這個包裏面的資源,如果依賴關係混亂,很容易導致材質丟失等現象。
  2. 如果多個AB包packageX都引用了一個未打包AB的資源UnPackage,那麼packageX包都會保留一份UnPackage資源的備份,這樣就導致了資源的冗餘。

測試案例:

  1. AB包引用未打包資源和引用已打包資源的對比:
    在這裏插入圖片描述
  2. 多個引用未打包資源和引用打包資源的對比:
    在這裏插入圖片描述

Unity判斷是否產生副本的邏輯:

foreach(包名)
{
    //-----對所有包進行遍歷-----
    name:packageNameAB
    foreach(packageNameAB下所有資源的路徑assetPath)
    {
        checkNonBundleNameDpendencies:
        //-----對包下所有資源進行遍歷-----
        foreach(assetPath對應的資源所依賴的資源路徑dependencyPath)
        {
            //-----對依賴路徑下所有的依賴對象進行判斷-----
            if(依賴路徑下資源沒有設置打包AB)
            {
                copy一份該資源入當前packageNameAB
                goto checkNonBundleNameDpendencies 再對這一個資源進行相同的遍歷處理
            }
        }
    }
}

結論: 總得來說,只要是AB包裏面的資源直接引用了(判斷是否直接引用可以通過用文本方式打開資源查看裏面是否有引用資源的GUID)未打包資源,那麼就會在本包內添加一個副本,而如果這個引用的資源是打了AB包的,那麼就不存在這個問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章