每個遊戲都有自己的啟動流程框架,有簡有繁,但是抽象出來總歸就是那麼幾個步驟,今天我們聊一聊這些步驟。
第1步:啟動
第2步:判斷當前設備所處環境是內網還是外網環境
原因:一般來說內網環境和外網環境在最終的服務器列表展示是不一樣的,外網是正式的服務器列表,內網則是一些測試的服務器列表
實現:www請求一個內網的url,如果請求成功則說明在內網環境
第3步:根據包體內固定的設備平臺的url【可能安卓/ios/Editor的url不一樣】以及內外網標識等信息去獲取對應的公告url,AssetBundleUrl,AppUrl,AppVersion,ServerList等
第4步:比對LocalAppVersion和RemoteAppVersion,如果不一致,則彈框提示去AppUrl下載新的App.否則繼續後面流程
第5步:初始化SDK環境【例如 此時初始化360的SDK】
第6步:檢測本地AssetBundle文件的變更,更新LocalAssetBundleList
原因:懂技術的同行們或者剛帶代碼離職的開發者可能會打開AssetBundle所在的目錄去修改某些AssetBundle內容,從而達到修改遊戲邏輯,或者遊戲數據的目的。
實現:客戶端自己試加載所有在LocalAssetBundleList中的AssetBundle文件,使用LocalAssetBundleList中AssetBundle文件對應的crc校驗碼去校驗這個加載的過程,如果校驗失敗,說明這個AssetBundle文件被修改過,或者被破壞了。那麼就從LocalAssetBundleList中刪除。當然如果LocalAssetBundleList這個文件也被破壞了導致程序識別不了格式,那麼就粗暴認為這個列表為空,需要全量下載所有的AssetBundle文件。
【LocalAssetBundList是客戶端本地存儲的一個加過密的文件 主要內容是一個字典,key為AssetBundle,Value為AssetBundle相關的信息,比如大小,位置,crc等,web服務器也有一份叫做RemoteAssetBundleList】
第6步:根據AssetBundleUrl下載對應的RemoteAssetBundleList文件,也就是下載web端最新的AssetBundle列表
第7步:將RemoteAssetBundleList和LocalAssetBundList進行比對差異,查找crc發生變化的,客戶端多餘的或者缺少的AssetBundle文件,然後更新到LocalAssetBundList
實現:高效實用Hash比對,得到差異列表DownloadAssetBundleList
第8步:下載DownloadAssetBundleList中標識的AssetBundle文件, 界面展示一個下載進度展示。
第9步:進入選服登陸界面,等待玩家選服登陸。
QA:
1:為什麼不使用LocalAssetBundleVersion和RemoteAssetBundleVersion去比對,如果兩者一致就不執行後續的AssetBundle流程的這個方式呢?
答:因為兩者一致的情況下,可能客戶端本地的一些AssetBundle文件已經被修改了,所以兩者一致其實嚴格意義上來說,是不能說明所有的AssetBundle也是一致的。
2:AssetBundle文件過多,下載耗時過長有沒有什麼優化方法?
答:
(1)想辦法減少AssetBundle的文件個數
(2)將多個AssetBundle文件擠壓成一個文件【擠壓格式自己設計】這樣可以較少與web通信的次數,從而節省耗時
(3)多線程下載