Unity跨平臺的機制原理

首先需要了解的是,Unity3D的C#基礎腳本模塊是通過Mono來實現的。

什麼是Mono?

參考下百度百科:Mono是一個由Novell公司(由Xamarin發起)主持的項目,並由Miguel de lcaza領導的,一個致力於開創.NET在Linux上使用的開源工程。它包含了一個C#語言的編譯器,一個CLR的Runtime,和一組類庫,並實現了 ADO NET和ASP NET。

它基於CIL和C#的ECMA標準,提供了了微軟.Net FrameWork的另一種實現。

Mono主要有以下部分組成:

C#編譯器——mcs。(最新的Mono版本已經可以支持C#5.0,但Unity3D的Mono版本仍然停留在2.0+階段(支持c#3.0),所以C#的一些新功能無法在unity中使用)

運行時:即時編譯器JIT(後文會介紹)。以及GC,類庫加載器等等。

基礎類庫(BCL)。

Mono類庫。提供了超出微軟.NET的一些類,提供了許多額外功能,主要是用於構建其他操作系統上的應用。

下面進入正題:

Mono和Unity

Unity引擎本身是由C++寫出的,只不過Mono被嵌入到了Unity當中,爲unity提供了一個完整的虛擬機運行環境。這樣Mono的嵌入接口會將Mono Runtime暴露給Unity底層的C++代碼。通過這些接口,開發者就可以控制Mono Runtime,以及依託於Mono Runtime的託管代碼。

Unity爲何能夠跨平臺?

一句話概括,主要原因在於Unity通過Mono使用了一種叫CIL(Common Intermediate Language,也叫MSIL)通用中間語言的基於堆棧的代碼指令集,它屬於CLR的一個子集。

Unity3D的開發過程中,代碼的編譯主要分爲兩個過程:

1)首先將對應的腳本代碼編譯成CIL(之後CIL還會被編譯成一種位元碼,生成一個CLI集合)。

2)然後Mono在運行時將CLI集合中的位元碼編譯爲本地運行的原生指令。(這裏會使用到上文中的JIT、AOT編譯模式)

注:也就是說在Mono中運行的其實是CIL,而在本地運行的是被編譯後生成的原生指令。

更多unity2018的功能介紹請到paws3d學習中心查找。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章