Unity3D学习笔记(2)Mono

在Unity3D中利用了Mono运行时来实现其脚本模块的基础。

先给出一个Mono的定义:

Mono是一个由Xamarin公司(先前是Novell,最早为Ximian)所主持的自由开放源代码项目。 该项目的目标是创建一系列匹配ECMA标准(Ecma-334和Ecma-335)的.NET工具,包括C#编译器和通用语言架构。与微软的.NET Framework(共通语言运行平台)不同,Mono项目不仅可以运行于Windows系统上,还可以运行于Linux,FreeBSD,Unix,OS X和Solaris,甚至一些游戏平台,例如:Playstation 3,Wii或XBox 360。

那么这里很明显可以看出:Mono具有跨平台的能力。

Mono跨平台的能力又是怎么实现的呢?来看看Mono的组件:

    1、C#编译器:从Mono2.11版本开始,采用的编译器叫mcs,它的作用是将C#编译为CIL(Common Language Infrastructure,通用中间语言,也叫MSIL微软中间语言,这个语言能运行在所有支持CIL的环境中)

      2、Mono运行时:运行时想要的是定义一个与具体语言无关的,跨架构系统的运行环境。其中有:即时编译器(Just-in-time,JIT)、提前编译器(Ahead-of-time compiler,AOT)、类加载器、垃圾回收器和线程系统等。C#代码经mcs编译成CIL后的byte code后就是在Mono运行时中经JIT或AOT转译为原生码(Native Code),这个原生码可以在当前机器运行,这就是Mono跨平台的原因。   

      3、基础类库:Mono平台提供了很多基础类,这些类库与.NET框架兼容。

      4、Mono类库:Mono自带的类库。


总之,在我们使用Unity3D开发游戏的过程中,C#代码编译的过程为:

       第一步:C#代码到CIL的编译(在mcs上发生)。

       第二步:CIL到CIL位元码的编译(在mcs上发生)。

       第三步:CIL位元码到本地指令的编译(在Mono运行时上发生,有3种转译方式,3种转译方式如下)

       a即时编译(Just-in-time,JIT):在程序运行的时候把CIL元码转译为目标平台的原生码。

        b. 提前编译(Ahead-of-time,AOT):在程序运行前就把CIL的位元码转译为目标平台的原生码并且存储,但是并不是全部的CIL的位元码都会提前转译并存储,仍然会有一小部分的CIL位元码会在程序运行的过程中转译。简单来说就是AOTJIT都有。

        c. 完全静态编译(Full-ahead-of-time,Full-AOT):这种模式是完全的AOT,不允许在程序运行的过程中使用JIT编译。程序在运行之前所有的代码必须都已经被编译成了目标平台的原生码。在ios平台的Unity3D开发必须用到这种模式。

你可能感兴趣的:(Unity3d)