unity 代码热更+资源管理框架总结
游戲要做熱更涉及到什么方面呢
首先就是代碼熱更,然后就是資源熱更
這些熱更新都依賴于打AssetBundle
然而打AssetBundle 你還要上傳服務器-對比更新-客戶端下載-加載-卸載這些流程
還有就是代碼熱更的一些問題 要怎么實現代碼熱更呢
一.對于代碼熱更有兩個方案
1.用其他語言做熱更,需要可以在C#這邊創建一個lua虛擬機,于是就要和C#能夠和Lua交互,C#執行lua虛擬機執行啟動代碼 所有邏輯用lua寫 打包lua文件進行代碼熱更
相關C#和lua交互的框架:
1.xlua 騰訊開源框架 目前算是大家用的最多的框架,商業項目也算是用的比較多
2.tolua,slua這些比較老的框架,算不上很了解
2.C#用反射模式執行啟動代碼,C#打dll ,但IOS沒有內存訪問權限,用不了反射模式,于是有了一些繞過IOS這個機制,做反射的框架
相關C#繞過IOS做反射的框架
1.ilruntime
ilruntime算是比較多人用的 以此衍生出的整套熱更+資源管理框架有:
QFramework,JEngine這些優秀框架
QFramework其他框架:對象池,UI,日志,音頻管理,動作序列
QF更像是一個工具集合 里面可用的模塊還是很多的 但是對于熱更新框架來講還是不夠完整
缺了資源下載,加密,管理卸載這些東西
適用項目:做二次開發的框架
JEngine其他框架:代碼加密,UI優化框架
適用項目:對于中小項目是夠用的
這類框架總得來說并不是很適用大項目
少了分包管理 對于一些需要自己控制AB包 顆粒度這塊 是要自己再做開發
2.huatuo
最新出的框架,在代碼調用,內存占用方面是比ilruntime優秀好幾倍的
市面沒有基于該框架的完整熱更+資源管理框架
對于C#打dll 有兩個方案
1.程序集定義
優點:限制多,不用新建類庫工程,代碼同步方便,解耦合
缺點:dll相互調用會有相互引用的問題,自己需要在代碼里面加載dll相關依賴,要分模塊分的很細才行,不然每次編輯都要加載很久(有時候快有時候慢 感覺這個東西不是很穩定),然而分的很細 又要花很多時間處理父子依賴問題
相互依賴的問題解決方案:
分模塊:管理器,數據,邏輯實體
例如進入一個場景
生成場景相關數據:物品,角色
這些生成邏輯由場景管理器去控制 然后把相關的數據放入到數據層
邏輯要想訪問數據直接訪問數據層
沒有對管理層的訪問權限
如果需要調用管理器的方法 直接通過回調函數進行調用
即管理器控制邏輯的初始化回調函數
這樣邏輯清晰也會比較解耦合
代碼加載dll依賴Assembly.LoadFrom
string gameDll = Application.streamingAssetsPath + "/LaunchClass.bytes";gameAss = Assembly.Load(File.ReadAllBytes(gameDll));Assembly.LoadFrom(Application.streamingAssetsPath + "/xasset.bytes");var appType = gameAss.GetType("LaunchGame");object o = Activator.CreateInstance(appType);var mainMethod = appType.GetMethod("PrintTest");mainMethod.Invoke(o, null);適合項目:工具,方便移植模塊的項目,最新的立項項目建議可以用這個
2.VS第三方類庫工程
優點:自由度高,不需要額外操作,新增一個類庫工程后引用相關dll就行了
缺點:代碼同步麻煩,要新增工程
用法:
手動添加整塊文件夾下的代碼到VS工程
添加dll引用
需要注意的點:unity不同的dll庫有相同的方法 如果同時using了兩個庫 用的時候需要聲明是要用哪個庫的方法
還有不要直接引用Managed下的dll
而是到下引用這些dll不然會有沖突 畢竟Managed下的dll方法并不全 需要用到子文件的dll
這個算是之前大家用的比較多的方案
二.資源管理框架
github唯一比較出名的框架:XASSET
資源管理容易出的問題:AB包加載序列化,IO占用,資源冗余,內存冗余,AB顆粒度控制
AB包加載序列化,IO占用:包體不宜太小或者太大 太小會導致加載AB包加載的(序列化內存占用) 加載和卸載的IO占用的問題(增大了硬件設備耗能和發熱的壓力) 最大2M不然會有加載卡頓(資源最大的就是圖片,字體了 要重視這塊的分包) -------------- 要分包
資源冗余: 被依賴資源沒打包,然后打包時把依賴資源打進這個AB包,如果這個依賴資源被兩個AB包依賴 則會多一份冗余(會被依賴打包的資源:shader 材質這些unity組件可以明確訪問到的依賴,不會依賴打包的如shader或代碼里面訪問一個資源 shader庫或其他的 ) --------------- 依賴資源打AB包
內存冗余:如果正在使用一個緩存資源(實例化出來了) 你去卸載 卸載掉了 但下次下載 再解壓就會有一個內存冗余 所以卸載 需要判斷這個資源是否有在使用(引用計數) 再去進行卸載 但并不是所有AB包都需要(引用計數)緩存 那樣內存肯定不夠用 只需要緩存經常用到的AB包 哪些不需要經常用到的AB包不考慮冗余 都是加載出來資源后立即卸載AB包
AB顆粒度控制:
要打一個包的:
角色:不然得加載十幾個AB包:prefab,FBX,mat,texture2D,shader,controller,anim
會有加載卡頓和手機發熱的問題
圖集:不然沒辦法圖集合批 不過好像unity有一個新出的SpriteAtlas可以用來做圖集
其他可以優化注意的點:
1.對于大一點的AB包使用異步加載 避免加載卡頓
2.卸載時可以開啟倒計時卸載 防止剛剛卸載就加載
3.卸載時判斷這個AB包是否已經加載出來 才能卸載
4.下載時對AB資源進行標識,下載完才能關閉標識,防止下載到一半退出游戲
5.分常駐內存的包(引用計數)和加載出來資源就卸載的包
最后當熱更和資源管理都做好后可以優化的點:
1.dll代碼的執行速度沒有il2cpp快
如果項目足夠穩定 可以把基礎框架 不打dll 只用xlua或者其他熱修復框架來做更新
2.分包功能:
防止玩家下載AB包時間過長 棄坑
可以分包下載,即有一些功能模塊是暫時可以不用下載也可以正常游戲的
需要玩家自己點下載這個包體 才下載下來才能進這個功能模塊
總結
以上是生活随笔為你收集整理的unity 代码热更+资源管理框架总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JUnit自动化单元测试
- 下一篇: CorelDRAW VBA - 读取和操