Addressables 初始化流程與熱更

Addressables踩坑記錄

首先應(yīng)該了解ResourceManager的基本流程,核心主要是以下幾塊耸采。

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

下面走進(jìn)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));
//以上是一些后面會(huì)用到解析catalog.json和catalog.hash對(duì)應(yīng)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)過理性分析,這里注冊(cè)了三個(gè)異步操作猴誊,并且有依賴關(guān)系潦刃,分別為: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的方法處理對(duì)應(yīng)的資源胧洒,這里處理完成得到了setting.json數(shù)據(jù),序列化到ResourceManagerRuntimeData數(shù)據(jù)結(jié)構(gòu)對(duì)象里面墨状,這里我們先打開一份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中的一些設(shè)置,初始化catalogLocations通今,從上面可以看到catalog有3個(gè)粥谬,如果沒看Remote,也就只有一個(gè)辫塌,就沒有接下來的步驟咯漏策。
  • 初始化catalog,主要是包含三個(gè):
    • 服務(wù)器上對(duì)于的catalog.hash
    • 本地持續(xù)化目錄的catalog.hash
    • 對(duì)比本地與服務(wù)器上catalog的hash值臼氨,判斷用本地的catalog.json還是遠(yuǎn)程的catalog.json掺喻,加載遠(yuǎn)程的catalog并替換本地的catalog,并解析出ContentCatalogData文件储矩,具體json解析邏輯在ContentCatalogData.CreateCustomLocator中感耙。
  • 最后解析出catalog.json中所有的資源location信息,并注冊(cè)到ResourceManager中持隧。
解讀Addressables中的資源加載

Addressables中主要是通過本地和遠(yuǎn)端catalog.hash對(duì)比即硼,并加載出最新的catalog.json文件,而catalog.json讀取的location信息會(huì)指明你需要加載的資源在本地還是服務(wù)器屡拨,從而AssetBundleProvider中通過不同的加載方式進(jìn)行加載只酥,本地目錄加載就不多說褥实,遠(yuǎn)程加載使用了UnityWebRequestAssetBundle做加載,并搭配CachedAssetBundle做本地緩存裂允,緩存使用BundleName以及資源的hash值损离,如果資源有變化,hash同樣也會(huì)發(fā)生變化绝编,本地命中失敗僻澎,具體邏輯可參考AssetBundleProvider

關(guān)于Addressables中的熱更

Addressables想依靠本地的catalog.hash與Remote的catalog.hash做對(duì)比,從而加載到我們打出的最新catalog.json文件十饥,從而解析出資源的location窟勃,這里Addressables有一個(gè)bug,上文代碼中標(biāo)注了IgnoreFailures設(shè)置為了true绷跑,它的本意是做第一次加載本地緩存時(shí)拳恋,因?yàn)楸镜乜沙掷m(xù)目錄是沒有catalog文件的凡资,所以忽略了加載失敗的情況砸捏,但是這也會(huì)導(dǎo)致我們從Remote加載hash文件的時(shí)候,如果加載失敗也并不會(huì)有異常拋出隙赁,而會(huì)直接使用可持續(xù)目錄下的catalog.json垦藏。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市伞访,隨后出現(xiàn)的幾起案子掂骏,更是在濱河造成了極大的恐慌,老刑警劉巖厚掷,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弟灼,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡冒黑,警方通過查閱死者的電腦和手機(jī)田绑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抡爹,“玉大人掩驱,你說我怎么就攤上這事《梗” “怎么了欧穴?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)泵殴。 經(jīng)常有香客問我涮帘,道長(zhǎng),這世上最難降的妖魔是什么笑诅? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任调缨,我火速辦了婚禮映屋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘同蜻。我一直安慰自己棚点,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布湾蔓。 她就那樣靜靜地躺著瘫析,像睡著了一般。 火紅的嫁衣襯著肌膚如雪默责。 梳的紋絲不亂的頭發(fā)上贬循,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音桃序,去河邊找鬼杖虾。 笑死,一個(gè)胖子當(dāng)著我的面吹牛媒熊,可吹牛的內(nèi)容都是我干的奇适。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼芦鳍,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼嚷往!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起柠衅,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤皮仁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后菲宴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贷祈,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年喝峦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了势誊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡愈犹,死狀恐怖键科,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情漩怎,我是刑警寧澤勋颖,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站勋锤,受9級(jí)特大地震影響饭玲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜叁执,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一茄厘、第九天 我趴在偏房一處隱蔽的房頂上張望矮冬。 院中可真熱鬧,春花似錦次哈、人聲如沸胎署。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)琼牧。三九已至,卻和暖如春哀卫,著一層夾襖步出監(jiān)牢的瞬間巨坊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工此改, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留趾撵,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓共啃,卻偏偏與公主長(zhǎng)得像占调,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子勋磕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

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