mono虛擬機器包含乙個實時編譯引擎,該引擎可用於如下處理器: x86, sparc, powerpc, arm, s390 (32位模式和64位模式), x86-x64, ia64和64位模式的sparc.該虛擬機器可以將**實時編譯或者預先編譯到原生**.對於那些沒有列出來的系統,則使用的是**直譯器.
unity的跨平台,就是通過mono將c#指令碼**編譯成cli(common language infrastructure,通用語言基礎結構),然後mono執行時利用jit(just-in-time compilation,即時編譯)或者aot(ahead-of-time,提前編譯或靜態編譯)將cli編譯成目標平台的原生**實現的。
其實現原理在於使用了叫cil(common intermediate language通用中間語言,也叫做msil微軟中間語言)的一種**指令集,cil可以在任何支援cli(common language infrastructure,通用語言基礎結構)的環境中執行,就像.net是微軟對這一標準的實現,mono則是對cli的又一實現。由於cil能執行在所有支援cli的環境中,例如剛剛提到的.net執行時以及mono執行時,也就是說和具體的平台或者cpu無關。這樣就無需根據平台的不同而部署不同的內容了。**的編譯只需要分為兩部分就好了:(1)從**本身到cil的編譯(其實之後cil還會被編譯成一種位元碼,生成乙個cli assembly) (2) 執行時從cil(其實是cli assembly,不過為了直觀理解,不必糾結這種細節)到本地指令的即時編譯(這就引出了為u3d官方沒有提供熱更新的原因:在ios平台中mono無法使用jit引擎,而是以full aot模式執行的,所以此處說的額即時編譯不包括ios)
net執行時和mono執行時,也就是說cil語言其實是執行在虛擬機器中的,具體到u3d也就是mono的執行時了,換言之mono執行的其實cil語言,cil也並非真正的在本地執行,而是在mono執行時中執行的,執行在本地的是被編譯後生成的原生**。
Unity跨平台的機制原理
首先需要了解的是,unity3d的c 基礎指令碼模組是通過mono來實現的。什麼是mono?它基於cil和c 的ecma標準,提供了了微軟.net framework的另一種實現。mono主要有以下部分組成 c 編譯器 mcs。最新的mono版本已經可以支援c 5.0,但unity3d的mono版本...
Unity3d跨平台原理
知乎的乙個提問 unity3d跨平台原理 一些資料 il是.net框架中中間語言 intermediate language 的縮寫。使用.net框架提供的編譯器可以直接將源程式編譯為.exe或.dll檔案,但此時編譯出來的程式 並不是cpu能直接執行的機器 而是一種中間語言il intermedi...
Unity3d跨平台原理
知乎的乙個提問 unity3d跨平台原理 一些資料 il是.net框架中中間語言 intermediate language 的縮寫。使用.net框架提供的編譯器可以直接將源程式編譯為.exe或.dll檔案,但此時編譯出來的程式 並不是cpu能直接執行的機器 而是一種中間語言il intermedi...