一.分析
首先,我們要知道Unity,Mono,.Net 三者的關系。需要簡單說一下.Net。
.Net擁有跨語言,跨平台性。
跨語言:就是隻要是面向.Net平台的程式設計語言,用其中一種語言編寫的類型就可以無縫的在另外一種語言編寫的應用程式中互操作。
跨平台:一次編譯,不需要任何代碼修改,應用程式就可以運作在任意在.Net實作的平台上跑,即代碼不依賴于作業系統,也不依賴硬體環境。一個.Net程式運作的核心在于.Net
CLR(公共語言運作時,或者稱為.Net 虛拟機,類似java虛拟機的概念),為了讓.Net程式在其他平台(目前隻能在.Net 平台,windows系統)上跑,微軟官方還推出了在其他平台上(MacOs,Linux)跑的
.Net的實作,就推出了.Net Core。
然而,Unity引擎需求也是需要跨平台,支援多語言(C#,Js,Boo)。就參考微軟開發.Net Core的概念,于是,推出了Mono.
畫個圖簡單對比一下:
到這裡,基本說明了.Net 與Mono和Unity的聯系關系,其實沒啥關系。做遊戲都知道,肯定需要跨平台,不能隻支援一種平台,不然每個對應的平台做出一種對應的編譯器,那真的會累死。是以對于跨平台的需求,對于遊戲開發而言,很重要。Unity的架構需求設計當然也需要這個特性。參考.Net依托CLR來實作設計思路,于是Mono就出來了。
二.Mono
1)Mono運作時
參考:https://blog.csdn.net/LMLBY/article/details/53539316?locationNum=15&fps=1
2)知識點
mcs編譯器
C#編譯器,C#編譯為IL中間指令。
Unity跨平台的原理
就是Mono運作時編譯器支援将IL代碼轉為對應平台原生碼,IL可以在任何支援CLI(Common Language Insfrastructure,通用語言環境結構)中運作,IL的運作是依托于Mono運作時。
IOS不支援jit編譯原因:
機器碼被禁止映射到記憶體,即封存了記憶體的可執行權限,變相的***了jit編譯方式,詳情參考:https://www.cnblogs.com/murongxiaopifu/p/4278947.html
JIT編譯
将IL代碼轉為對應平台原生碼并且将原生碼映射到虛拟記憶體中執行。JIT編譯的時候IL是在依托Mono運作時,轉為對應的原生碼後在依托本地運作。
AOT,JIT,Full-AOt三者關系:
注意JIT,AOT編譯并不是互斥關系,他們可以共存。Mono的AOT模式仍然會保留部分代碼在程式運作時采用jit編譯,因為ios被禁止了jit,為了解決這個問題,Mono提供了一個被稱為Full-AOT的模式。即預先對程式集中所有IL代碼進行AOT編譯生成一個本地代碼映像,然後在運作時直接加載這個映像而不再使用jit。