Addressables 初始化流程與熱更

Addressables踩坑記錄

首先應該了解ResourceManager的基本流程,核心主要是以下幾塊。

  • ResourceManager 資源管理類,目的是提供一種通用的方法來訪問資源,同時抽象出特定的加載實現(xiàn)。
    • IResourceLocation 資源定位類,包含了加載資源的全部信息 (what/where/how/dependencies)
    • IResourceProvider 資源提供者,提供不同資源的加載解析方式
  • IAsyncOperation 異步操作類,通過ResourceManager.StartOperation調(diào)用向管理器里面注冊異步操作,再由ResourcecManager進行統(tǒng)一調(diào)度管理(看上去賊蛋疼)。

下面走進Addressables.InitializeAsync(),探究Addressables 初始化流程。

  • InitializationOperation.CreateInitializationOperation
internal static AsyncOperationHandle<IResourceLocator> CreateInitializationOperation(AddressablesImpl aa, string playerSettingsLocation, string providerSuffix)
{
    var jp = new JsonAssetProvider();
    jp.IgnoreFailures = true; //!!!注意,這里坑得很
    aa.ResourceManager.ResourceProviders.Add(jp);
    var tdp = new TextDataProvider();
    tdp.IgnoreFailures = true;//!!!注意,這里坑得很
    aa.ResourceManager.ResourceProviders.Add(tdp);
    aa.ResourceManager.ResourceProviders.Add(new ContentCatalogProvider(aa.ResourceManager));
//以上是一些后面會用到解析catalog.json和catalog.hash對應Provider的初始化
    var runtimeDataLocation = new ResourceLocationBase("RuntimeData", playerSettingsLocation, typeof(JsonAssetProvider).FullName, typeof(ResourceManagerRuntimeData));

    var initOp = new InitializationOperation(aa);
    initOp.m_rtdOp = aa.ResourceManager.ProvideResource<ResourceManagerRuntimeData>(runtimeDataLocation);
    initOp.m_ProviderSuffix = providerSuffix;
    initOp.m_InitGroupOps = new InitalizationObjectsOperation();
    initOp.m_InitGroupOps.Init(initOp.m_rtdOp, aa);

    var groupOpHandle = aa.ResourceManager.StartOperation(initOp.m_InitGroupOps, initOp.m_rtdOp);

    return aa.ResourceManager.StartOperation<IResourceLocator>(initOp, groupOpHandle);
}

忽略前面provider初始化,經(jīng)過理性分析,這里注冊了三個異步操作,并且有依賴關系,分別為:initOp.m_rtdOp,initOp.m_InitGroupOps,以及initOp。

  • initOp.m_rtdOp 首先initOp.m_rtdOp是加載settings.json,包裝在ProviderOperation,主要操作為異步調(diào)用m_Provider.Provide(new ProvideHandle(m_ResourceManager, this));provider的方法處理對應的資源,這里處理完成得到了setting.json數(shù)據(jù),序列化到ResourceManagerRuntimeData數(shù)據(jù)結構對象里面,這里我們先打開一份setting.json
{
    "m_buildTarget": "StandaloneWindows64",
    "m_SettingsHash": "",
    "m_CatalogLocations": [{
        "m_Keys": ["AddressablesMainContentCatalogRemoteHash"],
        "m_InternalId": "http://localhost/StandaloneWindows64/catalog_2020.10.14.15.32.29.hash",
        "m_Provider": "UnityEngine.ResourceManagement.ResourceProviders.TextDataProvider",
        "m_Dependencies": [],
        "m_ResourceType": {
            "m_AssemblyName": "mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
            "m_ClassName": "System.String"
        }
    }, {
        "m_Keys": ["AddressablesMainContentCatalogCacheHash"],
        "m_InternalId": "{UnityEngine.Application.persistentDataPath}/com.unity.addressables/catalog_2020.10.14.15.32.29.hash",
        "m_Provider": "UnityEngine.ResourceManagement.ResourceProviders.TextDataProvider",
        "m_Dependencies": [],
        "m_ResourceType": {
            "m_AssemblyName": "mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
            "m_ClassName": "System.String"
        }
    }, {
        "m_Keys": ["AddressablesMainContentCatalog"],
        "m_InternalId": "{UnityEngine.AddressableAssets.Addressables.RuntimePath}/catalog.json",
        "m_Provider": "UnityEngine.AddressableAssets.ResourceProviders.ContentCatalogProvider",
        "m_Dependencies": ["AddressablesMainContentCatalogRemoteHash", "AddressablesMainContentCatalogCacheHash"],
        "m_ResourceType": {
            "m_AssemblyName": "Unity.Addressables, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null",
            "m_ClassName": "UnityEngine.AddressableAssets.ResourceLocators.ContentCatalogData"
        }
    }],
    "m_ProfileEvents": false,
    "m_LogResourceManagerExceptions": true,
    "m_ExtraInitializationData": [],
    "m_DisableCatalogUpdateOnStart": false,
    "m_IsLocalCatalogInBundle": false,
    "m_CertificateHandlerType": {
        "m_AssemblyName": "",
        "m_ClassName": ""
    },
    "m_AddressablesVersion": "1.16.1",
    "m_maxConcurrentWebRequests": 500
}
  • initOp.m_InitGroupOps,有了ResourceManagerRuntimeData數(shù)據(jù)之后執(zhí)行InitalizationObjectsOperation異步操作,這里主要是初始化m_ExtraInitializationData(setting.json)內(nèi)的數(shù)據(jù)(目前沒用到)
  • 最后執(zhí)行initOp,也就是InitializationOperation,初始化setting.json中的一些設置,初始化catalogLocations,從上面可以看到catalog有3個,如果沒看Remote,也就只有一個,就沒有接下來的步驟咯。
  • 初始化catalog,主要是包含三個:
    • 服務器上對于的catalog.hash
    • 本地持續(xù)化目錄的catalog.hash
    • 對比本地與服務器上catalog的hash值,判斷用本地的catalog.json還是遠程的catalog.json,加載遠程的catalog并替換本地的catalog,并解析出ContentCatalogData文件,具體json解析邏輯在ContentCatalogData.CreateCustomLocator中。
  • 最后解析出catalog.json中所有的資源location信息,并注冊到ResourceManager中。
解讀Addressables中的資源加載

Addressables中主要是通過本地和遠端catalog.hash對比,并加載出最新的catalog.json文件,而catalog.json讀取的location信息會指明你需要加載的資源在本地還是服務器,從而AssetBundleProvider中通過不同的加載方式進行加載,本地目錄加載就不多說,遠程加載使用了UnityWebRequestAssetBundle做加載,并搭配CachedAssetBundle做本地緩存,緩存使用BundleName以及資源的hash值,如果資源有變化,hash同樣也會發(fā)生變化,本地命中失敗,具體邏輯可參考AssetBundleProvider

關于Addressables中的熱更

Addressables想依靠本地的catalog.hash與Remote的catalog.hash做對比,從而加載到我們打出的最新catalog.json文件,從而解析出資源的location,這里Addressables有一個bug,上文代碼中標注了IgnoreFailures設置為了true,它的本意是做第一次加載本地緩存時,因為本地可持續(xù)目錄是沒有catalog文件的,所以忽略了加載失敗的情況,但是這也會導致我們從Remote加載hash文件的時候,如果加載失敗也并不會有異常拋出,而會直接使用可持續(xù)目錄下的catalog.json。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 簡介 Unity可尋址資源系統(tǒng) 可尋址資源系統(tǒng)提供了一種簡單的方法通過“地址”加載資源。簡化資源包的創(chuàng)建和部署的管...
    hh5460閱讀 9,834評論 2 10
  • 基本信息 es6中const定義的屬性是否可以改變? 可以的,為什么會這樣呢?這是由于對象或者數(shù)組屬于引用數(shù)據(jù)類。...
    習慣就好a閱讀 8,726評論 0 1
  • 2019.3.38 比較兩個文件 英文 detect: 檢測2019.3.27 如何找到第一個bug出現(xiàn)的comm...
    饒家俊閱讀 2,688評論 0 1
  • kettle源碼分析 :本次源碼分析 基于 kettle v4.0 分析: 背景:因最近新增一個需求,需要將原來在...
    唐僧吃肉_閱讀 3,972評論 1 4
  • 久違的晴天,家長會。 家長大會開好到教室時,離放學已經(jīng)沒多少時間了。班主任說已經(jīng)安排了三個家長分享經(jīng)驗。 放學鈴聲...
    飄雪兒5閱讀 7,868評論 16 22

友情鏈接更多精彩內(nèi)容