Unity 與Mono和.Net的關係

一.分析

     首先,咱們要知道Unity,Mono,.Net 三者的關係。須要簡單說一下.Net。html

    .Net擁有跨語言,跨平臺性。java

    跨語言:就是隻要是面向.Net平臺的編程語言,用其中一種語言編寫的類型就能夠無縫的在另一種語言編寫的應用程序中互操做。ios

    跨平臺:一次編譯,不須要任何代碼修改,應用程序就能夠運行在任意在.Net實現的平臺上跑,即代碼不依賴於操做系統,也不依賴硬件環境。一個.Net程序運行的核心在於.Net編程

CLR(公共語言運行時,或者稱爲.Net 虛擬機,相似java虛擬機的概念),爲了讓.Net程序在其餘平臺(目前只能在.Net 平臺,windows系統)上跑,微軟官方還推出了在其餘平臺上(MacOs,Linux)跑的windows

.Net的實現,就推出了.Net Core。架構

     然而,Unity引擎需求也是須要跨平臺,支持多語言(C#,Js,Boo)。就參考微軟開發.Net Core的概念,因而,推出了Mono.編程語言

     畫個圖簡單對比一下:操作系統

     

      到這裏,基本說明了.Net 與Mono和Unity的聯繫關係,其實沒啥關係。作遊戲都知道,確定須要跨平臺,不能只支持一種平臺,否則每一個對應的平臺作出一種對應的編譯器,那真的會累死。因此對於跨平臺的需求,對於遊戲開發而言,很重要。Unity的架構需求設計固然也須要這個特性。參考.Net依託CLR來實現設計思路,因而Mono就出來了。.net

二.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。
相關文章
相關標籤/搜索