'Unity手遊的客戶端啟動流程總結'

Unity引擎 iOS 我是一個夜貓子程序猿 2019-08-05
"

每個遊戲都有自己的啟動流程框架,有簡有繁,但是抽象出來總歸就是那麼幾個步驟,今天我們聊一聊這些步驟。

第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)多線程下載

"

相關推薦

推薦中...