《炉石传说》架构设计赏析(4):Asset管理
話說,經過這段時間的學習和摸索,對于Unity3D的開發思路已經基本清晰了。唯獨還剩下一個AssetBundle機制還沒有搞透,這個涉及到前期項目的資源規劃、資源管理代碼的寫法,以及自動更新機制的實現。
所以,還是想先把游戲邏輯的進一步分析押后,先來看一下《爐石傳說》Asset管理。必須得說一下的是,目前分析都是PC版的程序集,對于移動端不一定完全合適,且當做一個案例分析吧。
本文主要講述《爐石傳說》的AssetBundle的管理機制。它的機制比較簡單清晰,中規中矩,中間的分析過程就不講了,直接展現其架構設計和代碼邏輯組織。先從Asset管理相關的類講起。
class Asset:資源信息描述
?
Asset類,并不管理直接的資源對象,而是保存的一個Asset相關的信息,具體請看上圖。
另外,它還有一個“paths”變量,這是一個Dictionary,key是AssetFamily枚舉,value是Assetbundle的路徑和資源路徑。下面的AssetFamily一節詳細解釋。
enum AssetFamily-資源分類
?
如上圖所示:
?
- 爐石根據資源的不同類型進行分別的AssetBundle打包,一類資源對應一個或者多個資源包;(一類資源分多個包的規則不得而知);
- 有的資源包真的本地化單獨打包,例如“fonts0.unity3d”==》“fontszhCN0.unity3d”;
- 在程序中,資源包的分類對應枚舉類型“AssetFamily”;
- 資源包的具體路徑信息,存儲在Asset.paths,這是一個靜態變量;在初始化時,手動填寫必要的信息,類似這樣:
- 另外,還有一個class AssetBundleInfo是記錄了每種AssetBundle對應的主文件名,以及包文件的個數、對應的對象類型等信息;詳見下圖:
class AssetLoader:資源加載
?
游戲運行時需要加載各種資源,基本上都是通過AssetLoader(也有個別情況適用了Resources.Load())。接下來我們就重點看一下AssetLoader的實現思路。
AssetLoader對上層提供資源對象加載接口,對于每種類型的資源都提供一組函數,例如LoadCardPrefab,LoadActor等等。對于對象加載完成、加載進度等提供回調函數。這些函數只是一些簡單的包裝,其內部都調用到LoadCachedGameObject()或LoadCachedObject()這兩個核心函數。
從這兩個函數的流程可以看到,資源加載使用到了Cache機制:
1.首先從AssetCache中查找,如果找到了,則更新Cache項的時間戳,并調用回調;
2.如果沒有找到,則向AssetCache添加一個Request,然后啟動Coroutine:CreateCachedAsset(),它的調用步驟是:
?
- 調用AssetCache.StartLoading();
- 啟動Coroutine:CreateCachedAsset_FromBundle<RequestType>():
- 使用AssetLoader.GetBundleForAsset()找到資源所屬的AssetBundle;
- 調用AssetBundle.LoadAsync()來真正加載資源;
- 在加載的過程中,根據處理的結果調用:AssetCache.CacheRequest的OnLoadFailed()、OnLoadSucceeded()、OnProgressUpdate()等函數;
- 在AssetCache查找此資源,如果找到了,則加載成功,調用回調函數;
調用AssetCache.StopLoading();
我們都知道在開發過程中,不能使用AssetBundle(每次啟動都要打包,肯定收不了)。懷疑它的Editor模式相關的代碼是用預編譯宏處理來實現的,所以未出現在發布出來的程序集當中,類似這樣:
?
class AssetCache:資源的Cache機制
前面在AssetLoader一節我們已經講到了AssetCache機制,這里再做一個詳細的闡述。
?
前面我們已經講到:
?
- AssetCache中的資源項的時間戳,由AssetLoader在資源加載請求時維護;
- AssetCache主要負責管理Cache數據,而真正的資源加載動作還是在AssetLoader中執行;
AssetCache的資源淘汰主要由外部的各個模塊根據自己認為需要的時機去調用,例如:
?
- SceneMgr.ClearCachesAndFreeMemory()
- LoadingScreen.ClearAssets()
- SoundMgr.UnloadSoundBundle()
- 等等
另外,程序啟動時會自動更新資源包(在Login.OnAssetsVersion()中啟動),主要是通過UpdateManager和Downloader兩個類來處理。
OK,總結一下爐石的資源管理機制:
?
- 對游戲資源按照類型分包,買二手游戲每一類資源包可以有多個;
- 在游戲運行時使用Cache機制;
總結
以上是生活随笔為你收集整理的《炉石传说》架构设计赏析(4):Asset管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《轩辕传奇手游》主程序带你拆解MMORP
- 下一篇: 回顾游戏中的设计模式:策略模式vs抽象工