iOS代码质量要求_Unity移动端代码热更新技术学习总结
為什么需要熱更新
游戲總是伴隨著不斷的開發與維護,我們不能要求玩家每次都將游戲客戶端卸載重裝,所以需要熱更新技術來在不需要重裝客戶端的情況下下載更新游戲里的代碼(其實資源也需要熱更新,但是因為操作系統沒有對資源文件熱更新做限制,所以這里按下不提)。
直接覆蓋DLL
這里只說android平臺,unity打包安裝包之后會生成一個apk文件,該文件事實上是一個zip文件,只是后綴名不同,解壓可以看到在 assetsbinDataManaged 目錄下有 predefined assemblies,也就是腳本編譯成的DLL(默認名為Assembly-CSharp,在VS的 Solution Explorer 里可以看到),這就是游戲運行時代碼所在,如果可以將新代碼的dll直接覆蓋替換,即可實現熱更的目的,自定義 assemblies 的情況也差不多,覆蓋需要的dll就完事了(要注意版本,宏之類的坑)。上面說的是mono的情況,IL2CPP的話,則是另外的目錄(libarmeabi-v7a)這里有個小坑,so文件中存放的只是代碼段,數據段(比如字符串)是在assetsbinDataManagedMetadataglobal-metadata.dat 中。我測試的時候只改了覆蓋了so文件,結果修改沒有生效讓我困惑了老半天 。unity 用于快速迭代的pacth功能,也是類似的原理。不過因為ios平臺上不支持JIT而且還禁止dll熱更,所以不支持這種方法,所以如果只開發安卓平臺的話,就可以用這種方法,簡單直觀。不過現實是稍微正經的項目都是要支持ios的,畢竟市場占有率擺在那。。所以接下來回到現實。
基于Lua的熱更
單純使用Lua開發
Lua 是一種腳本語言,可以運行再對應平臺的虛擬機上。Lua 在虛擬機上是被 解釋-執行,而不是像 JIT 一樣先編譯成對應機器碼,所以不會受到IOS的限制。我們所需要做的就是在程序里嵌入一個Lua解釋器然后在運行時讀取腳本并解釋執行(當然,還要再C#與Lua代碼之間做一些數據通信,以及在Lua代碼支持對C#的調用 )。比如像下面這樣的代碼
void通過覆蓋腳本即可實現邏輯的更新。lua方案相比起C#通過 JIT 或者 AOT 得到的 native code 一般而言性能上相對弱勢,更不用說還有 IL2CPP這種東西。把性能敏感模塊弄成非 lua 代碼還是相當地有必要的。所以還是需要提前確定好哪部分代碼是需要熱更的,需要項目把頻繁迭代的業務模塊以及穩定的基本功能模塊劃分開來,(不過大部分項目早期開發基本所有地方都是要頻繁地迭代修復的。。。)。
C#轉Lua
Lua 這種弱類型語言開發效率與維護體驗對很多人來說都是不如C#的,于是就出現了一些能夠將C#代碼轉換為Lua的工具。比如這個。但是顯然lua不可能把所有特性都支持了,實際項目也不是所有代碼都需要熱更新,實際搞進工作流還是有很多的麻煩的,不過幸好已經有了很多比較成熟的方案,比如 xlua 。總的來說這類方案的核心熱更原理還是基于Lua解釋型腳本語言的特點。
ILRuntime
Unity 是通過Mono來將 C# 編譯為 CIL,然后通過將 CIL 運行不同平臺的CLR上來實現跨平臺。前面提到了IOS禁止動態加載dll與JIT。但是并沒有禁止腳本解釋。ILRuntime即是實現了一個IL的運行時,或者說解釋器,把dll中的 IL 指令像腳本一樣解釋執行,而不是通過JIT或者AOT編譯為機器碼。這實在是一個思路清奇的東西,整出了C#編譯成IL運行一個能解釋IL的解釋器并用他來解釋執行別的IL這樣給人套娃感覺的東西,作者是真的強。
因為IOS還是禁止dll更新,所以要把編譯完包含 IL 的 dll(還有pdb,如果希望有調試信息的話) 打包成另外的文件加載,然后在運行時動態加載、解析、解釋、執行。
ILRuntime的好處是,開發語言可以繼續使用C#(或者別的能編譯成IL的語言)進行開發。同時還能實現熱更。開發效率比純 Lua 的高,支持的C#特性比C#轉Lua的方案要多。缺點是性能較差(僅限不支持JIT的平臺,有JIT的話ILRuntime會跑得更快,性能能被拉平),主要是體現在一些計算密集的地方,相比起Lua會有劣勢。
然后使用時還需要注意跨域繼承(注意不要繼承 Mono Behavior,坑太多。。),如果腳本代碼也需要熱更的話,就對幾個事件函數做一下重定向(當然,這里得用ILRuntime調用熱更代碼的接口,我見過居然用反射來重定向到熱更代碼的人。。)、傳遞閉包時需要寫適配,還有用 CLR綁定和值綁定優化性能熱點,不過官方提供了一些自動生成代碼的工具,結合項目情況改改還是問題不大的,至少不會比寫Lua惡心。 如果使用IL2Cpp的話,還要注意對泛型方法做CLR綁定以及類型裁剪的坑。更多細節可以看官方文檔。
代碼文件的熱更
上文中沒有提及到的一個很重要的點就是沒有提及代碼文件(Lua腳本,或者DLL)如何下載覆蓋更新,事實上這個問題與代碼熱更新關系不大,可以把這些代碼文件當成普通的資源從服務器上下載、更新、加載,當然這個過程還涉及到一些版本比較之類的東西,本文就不詳細展開了。
參考鏈接
flashyiyi:一些新潮的Unity熱更方案?zhuanlan.zhihu.comhttps://ourpalm.github.io/ILRuntime/public/v1/guide/index.html?ourpalm.github.io總結
以上是生活随笔為你收集整理的iOS代码质量要求_Unity移动端代码热更新技术学习总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java在控制台打印余弦曲线,java打
- 下一篇: ef mysql db first_Ne