cocoscreator的熱更原理
1批狐,服務(wù)器端保存最新版本的完整資源
2,客戶端發(fā)送請(qǐng)求服務(wù)器端版本進(jìn)行對(duì)比獲得差異列表
3翰铡,從服務(wù)器下載所有新版本中改動(dòng)的資源文件
4饵溅,用新資源覆蓋舊緩存以及應(yīng)用包內(nèi)的文件
Cocos 的熱更新機(jī)制通過直接比較最新版本和本地版本的差異來生成差異列表并更新妨退。
客戶端存在一個(gè)project.manifest文件,該文件包含幾個(gè)信息:
packageUrl:url,服務(wù)器更新數(shù)據(jù)包根目錄咬荷;
remoteManifestUrl:url冠句, [可選項(xiàng)]服務(wù)器上project.manifest文件的url,
remoteVersionUrl:url萍丐,服務(wù)器上version.mainifest文件的url轩端;
version:x.x.x,項(xiàng)目版本;
assets:{},資源列表逝变;
key:? ? ? ? ? ? 資源的相對(duì)路徑(相對(duì)于資源根目錄)
md5:? ? ? ? ? ? md5 值代表資源文件的版本信息
compressed:? ? ? [可選項(xiàng)] 如果值為 true,文件被下載后會(huì)自動(dòng)被解壓奋构,目前僅支持 zip 壓縮格式
size:? ? ? ? ? ? [可選項(xiàng)] 文件的字節(jié)尺寸壳影,用于快速獲取進(jìn)度信息
searchPaths:" ",搜索路徑
客戶端通過本地的project.manifest中url,可以獲取服務(wù)器上project.manifest文件弥臼,比較兩者的version屬性宴咧,如果客戶端的version比服務(wù)器低,則啟動(dòng)更新径缅。
更新的內(nèi)容:assets是文件列表掺栅,里面列出了項(xiàng)目中的完整資源,每個(gè)資源都有md5表示纳猪,客戶端根據(jù)本地project.manifest中的assets列表和服務(wù)器的assets列表對(duì)比氧卧,下載不同的資源到臨時(shí)文件夾,如果最后所有資源都正常氏堤,則把臨時(shí)文件夾的內(nèi)容替換到本地緩存文件夾中沙绝,并且修改優(yōu)先搜索路徑為該文件夾。所以重啟游戲之后的使用的資源優(yōu)先從緩存文件夾中搜索鼠锈。
ocoscreator熱更新是對(duì)遠(yuǎn)程版本和本地版本的 版本號(hào)進(jìn)行對(duì)比cocoscreator認(rèn)為 本地版本號(hào)小于遠(yuǎn)程版本號(hào)就需要進(jìn)行熱更闪檬,版本號(hào)如何而來呢? 是在 manifest文件里獲取购笆,我們把攜帶高版本號(hào)的 manifest文件和最新的構(gòu)建資源放到遠(yuǎn)程服務(wù)器 粗悯,同時(shí)本地的包內(nèi)留有版本較低和舊的資源,當(dāng)在需要檢查熱更的時(shí)候 同欠,cocoscretor會(huì)先初始化本地包內(nèi)的manifest文件样傍,同時(shí)創(chuàng)建指定目錄的臨時(shí)文件夾和緩存文件夾 比如緩存文件夾是plane,臨時(shí)文件夾則為plane.temp。下載遠(yuǎn)程的version.manifest文件緩存到本地 行您,獲取版本號(hào)铭乾,進(jìn)行比較,遠(yuǎn)程版本高娃循,則下載 攜帶資源信息的project.manifest 文件到臨時(shí)文件夾plane.temp下炕檩。接著對(duì)比本地project.manifest與從遠(yuǎn)程下載到臨時(shí)文件夾中的project.manifest 資源列表 即 當(dāng)中的assets表,然后生成差異列表。然后通過downloader進(jìn)行下載差異列表中的文件到本地笛质,如果有壓縮文件解壓縮泉沾。文件下載成功后,對(duì)下載的文件進(jìn)行校驗(yàn)接著通知下載進(jìn)度妇押,保存下載進(jìn)度跷究,檢查是否有失敗的資源,如果沒有 則 拷貝臨時(shí)文件夾的所有內(nèi)容到 設(shè)定的緩存目錄敲霍,如果更新失敗不拷貝臨時(shí)資源到緩存目錄俊马,避免了污染原有的本地緩存資源。cocoscreator會(huì)使用manifest文件標(biāo)示每個(gè)資源的狀態(tài)(未開始肩杈,下載中柴我,下載完成)如果熱更中途網(wǎng)絡(luò)中斷,重新啟動(dòng)熱更扩然,cocoscreator會(huì)檢查臨時(shí)文件夾中是否有未完成的更新艘儒,校驗(yàn)版本是否和遠(yuǎn)程匹配之后,則使用臨時(shí)文件夾中的manifest作為遠(yuǎn)程manifest繼續(xù)更新(前提是臨時(shí)文件中已經(jīng)下載了project.manifest夫偶。在臨時(shí)文件夾中的命名會(huì)有一個(gè).temp后綴)此時(shí)對(duì)于下載狀態(tài)為完成的不會(huì)重新下載界睁,對(duì)于下載中的文件一般是從頭開始下載。更新完成后 cocoscreator將遠(yuǎn)程的 版本文件project.manifest 作為當(dāng)前本地的 project.manifest,下次更新 即用最新的 manifest文件的版本號(hào)對(duì)比接著 保存本地project.manifest文件的搜索路徑兵拢,重啟游戲翻斟,執(zhí)行main.js。main.js中把緩存文件夾搜索路徑前置到搜索路徑卵佛, 進(jìn)入游戲即 用到的資源 為最新的資源杨赤,達(dá)到熱更新效果。
注意:下載失敗了如何處理截汪,當(dāng)熱更過程中出現(xiàn)異常疾牲,下載失敗,解壓失敗衙解,校驗(yàn)失敗都會(huì)觸發(fā)UPDATE_FAILED回調(diào)事件阳柔,此時(shí)所有下載失敗的資源列表會(huì)記錄在熱更管理器中, 此時(shí)我們可以調(diào)用
assetsManager.downloadFailedAssets();
重新進(jìn)入熱更流程蚓峦,僅下載失敗的資源舌剂。
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)暑椰,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處霍转。