1. 程式人生 > >Unity 與Mono和.Net的關係

Unity 與Mono和.Net的關係

一.分析

     首先,我們要知道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。