Unity 的跨平台以及熱更

2021-10-01 09:24:42 字數 1176 閱讀 6445

1.unity的跨平台原理

首先說到unity的跨平台。unity的跨平台是基於mono實現的,在windows上,.netframework提供了vs的編譯器,將c#**編譯為cil的**指令集(中間碼),然後通過clr將中間碼變為機器碼執行。cil是一種可以在任何支援cli(common language infrastructure 公共語言基礎設施)的環境中執行。而mono則是重寫了.netframework在windows上的clr,構建了基於各個平台的不同的虛擬機器,這些虛擬機器的工作就是在這些不同的平台上,將cil code編譯為機器碼放在記憶體中供系統執行。

2.unity3d為何可以熱更新

jit模式能夠在執行時才將cil(通常儲存在.exe和.dll檔案中)編譯成nativecode,所以我們就可以 在執行前將cil位元組碼進行替換,就達到所謂的熱更新了。

3.為何在ios不能夠進行熱更

因為絕大多數平台unity3d都是依靠jit模式進行熱更。而在ios平台上jit模式被變相的禁止了,到底是怎麼禁止的呢?其實就是因為,jit將cil編譯為nativecode的時候,需要開闢一段記憶體空間,需要這段記憶體空間可讀、可寫、可執行,然後把nativecode(機器碼)放入,修改cpu指令指標暫存器中的位址讓cpu執行這段機器碼。

然而在ios上,它為了保證安全問題,禁止了使用者具有可執行許可權的空間,這就相當於直接要求我們必須用full_aot的模式進行靜態的編譯,而這種靜態的編譯就無法做到對cil指令集在執行期間的更改了,因為它早已經全部編譯完成。

4.為何lua語言可以熱更

lua語言是解釋型語言,如果它的解釋原理和c#相同編譯成中間碼然後再編譯成機器碼的話,那肯定也不能再ios上解釋執行。但是lua使用c語言編寫的指令碼語言,c語言在執行時讀入lua編寫的**,編譯成c**而不是機器碼,不用開闢特殊的記憶體空間,執行它的是用c**寫出來的虛擬機器,這個c#機制完全不同。

總結

lua是一種基於已經存在的某種語言的一種新語言,這也是指令碼語言和c#、c++這種語言的本質區別。當然lua的虛擬機器不單單可以用c寫,也可以用c#寫,熱更也不一定要用lua,python也可以,但是lua的優點是短小精悍。

Unity之熱更初探

由於c 是編譯 解釋型的語言,所以遊戲在出包之後想要再修改一些程式就比較困難。通過不斷查詢找到幾種可行的方案 1.更新dll,利用反射做 的更新。在ios上有限制,無法使用 2.引入嵌入式指令碼語言lua。有tolua xlua等框架 3.採用ilruntime等第三方框架。最終還是選擇xlua框架...

MLN 支援熱更的移動跨平台解決方案

經歷了兩年多的打磨及開發實踐,mln終於開源了,git位址mln即momo lua native,是lua程式到android ios原生的媒介,與rn和weex依賴jscore不同,mln處理lua to native的介質是lua虛擬機器,lua虛擬機器支援將c函式對映到虛擬機器中,並支援在lu...

Unity跨平台的機制原理

首先需要了解的是,unity3d的c 基礎指令碼模組是通過mono來實現的。什麼是mono?它基於cil和c 的ecma標準,提供了了微軟.net framework的另一種實現。mono主要有以下部分組成 c 編譯器 mcs。最新的mono版本已經可以支援c 5.0,但unity3d的mono版本...