本文介紹熱更新有關的基礎概念,流程和知識點,以及需要注意的事項(獨家經驗,傾囊相授),專案型別為cocos-lua,非quick
1.手游更新可以分為整包更新和熱更新
A.通過重新下載來更新,可稱之為整包更新 ,整包更新會造成用戶流失(給玩家思考要不要重新下載的機會),以及有appstore審核被拒絕的可能性,因此能熱更新則熱更新,除非改動C++代碼才整包更新,
B.通過下載最新代碼和資源來更新,叫做熱更新,
2.熱更新原理
首先要說明的是存放代碼的src和資源的res目錄是非可讀寫目錄,因此熱更新的資源是無法下載到之前目錄的,那么就得建立一個手機上可讀寫的目錄假設稱之為hot目錄,hot目錄下也建立src和res目錄,更新的資源全都存放到hot下的src和res,假設訪問file.lua時,優先訪問hot/src下的file.lua,當hot/src下不存在file.lua時去src下訪問,這里hot/src叫做搜索路徑,通過cc.FileUtils:getInstance():addSearchPath("hot/src/", true)設定, 引數true代表把當前路徑優先級設為最高,設定搜索路徑之后,檔案的全路徑=搜索路徑+相對路徑,因而實作了先hot/src后src的訪問順序,
3.熱更新流程
A.啟動游戲后下載資源服務器游戲版本號
B.對比本地版本號和服務器版本號差異,判斷整包更新/熱更新/不用更新
C.如果是熱更新的話下載更新檔案
D.邊下載邊檢測是否完成,顯示進度條(通過幀調度器實作,每幀檢測)
E.檢測到下載完成后,將服務器下載的版本檔案放到hot或其子目錄下(這里如果你下載檔案保存的目錄就是hot則所有檔案下載完成再保存版本檔案,如果你下載的目錄不是在hot下,則完成時把所有檔案包括版本檔案拷貝到hot目錄下)
F.下載完成后洗掉不需要的檔案,清理各類緩( cc.FileUtils:getInstance():purgeCachedEntries() ),否則本次更新的檔案不會生效,重啟游戲(基于E,本次對比時和服務器版本一定會一致,直接進入游戲)
4.熱方式可分為md5更新和差異包更新兩種方式
假設 線上發布了版本1.0,現在需要進行版本1.1的熱更新
4.1.md5生成差異串列式更新(推薦,主流)

概述:先用python生成兩個版本檔案,假設名為version.json和asset.json,version.json里記錄游戲版本號假設為100.100,左邊用來判斷整包更新,右邊用來判斷熱更新,每次更新時讓版本號+1,asset.json里記錄src和res下所有檔案的資訊(路徑,大小,MD5){"assets": {"res/assets/bg.png": ["11c6793a636950dc74f0124b71605564", 38661],...},這里檔案分成兩個的原因是當游戲較大之后asset.json可能有幾MB的大小,下載時需要2秒以上,避免不需要更新時下載asset.json,也就是說先下載version.json判斷要不要熱更新,要熱更新則再下載asset.json,然后將下載下來的asset.json本地的asset.json對比(用一個回圈判斷md5值是否相等)生成差異檔案串列(隨著檔案增多,生成差異串列時間會越來越長,可多達3秒以上),最后遍歷差異檔案串列依次下載服務器上的最新檔案,下載完成后洗掉不需要的檔案,
優點:開發者出新版本較快,資源服務器只有一套最新版本的資源,不用考慮跨版本更新的問題,進度條可以較準確反應實際進度,
缺點:因為沒有壓縮,下載時流量較多,
4.2.差異包式更新

概述:和md5更新相比,差異包更新當請求下載時直接下載當前版本到最新版本的壓縮包,然后解壓完成更新,需要注意,假如1.2發布,因為線上同時存在1.0、1.1版本,所以需要生成差量包 1.0-1.2.zip,以及 1.1-1.2.zip,同理,假如一款產品經歷了更新:1.1、1.2、1.3...1.9,那么當進行2.0熱更新的時候,那么需要生成的差量包是 1.0-2.0.zip、1.1-2.0.zip...1.9-2.0.zip,
優點:玩家下載流量小,
缺點:維護成本高,開發人員發新版本較慢,進度條不好做,較難準確反應實際進度,
Cocos其實自帶了熱更新功能,AssetsManager對應差異包更新, AssetsManagerEx對應md5更新,不過成熟專案似乎很少用自帶的,都是自己做一套熱更新
5.md5熱更注意事項(實戰經驗,傾囊相授)
5.1 斷點續傳的概念(必做)
舉例來說,檢測需要下載20MB,下載了5MB然后退出游戲,下次重新進入時提示需要下載15MB,繼續下載,可通過生成下載串列時判斷檔案是否已經存在來實作,cc.FileUtils:getInstance():isFileExist(path)
5.2 檔案完整性校驗(選做,最好做了)
由于下載的檔案受網路不穩定,作弊,劫持等情況影響,可能出現下載保存到客戶端后的檔案和版本服務器上的檔案不一致的情況,最后保存后呼叫一個函式生成md5嗎和服務器的md5對比校驗是否一致,不一致則重新下載,這樣可確保進入游戲時沒有錯誤的檔案而導致報錯和bug,
lua版下載地址:md5.lua/md5.lua at master · kikito/md5.lua · GitHub
實測lua版生成效率上不穩定,在安卓模擬器上有時很慢,因此最好用C++介面,且需要在真機上測驗驗證其效率,
5.3 為了實作斷點續傳需要考慮下載一個檔案后保存路徑的選擇,根據和熱更目錄是否一致,有兩種方案
A 和熱更目錄不一致
保存到另一個目錄假設稱之為down目錄,這種情況直接保存服務器版本檔案asset.json,version.json,下載完成后把down目錄的所有檔案拷貝到hot目錄,這里注意必須保證拷貝函式的寫法和拷貝結果正確,驗證方法是觀察文本檔案內容,和非文本的二進制檔案(csb,mp3,png等)他們的大小從原位置到新位置后是否一致,換言之可能出現文本檔案內容不一致,二進制檔案大小不一致的情況,
B 和熱更目錄一致
直接保存到hot目錄,這種情況完成下載后再保存版本檔案asset.json,version.json,且必須做檔案完整性校驗,因為下載中斷重進下載時,無法判斷hot目錄下的檔案是上次下載的還是上次下載之前已經存在的,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/376042.html
標籤:其他
