Unity跨平台的机制原理

简介: 首先需要了解的是,Unity3D的C#基础脚本模块是通过Mono来实现的。什么是Mono?参考下百度百科:Mono是一个由Novell公司(由Xamarin发起)主持的项目,并由Miguel de lcaza领导的,一个致力于开创.NET在Linux上使用的开源工程。

首先需要了解的是,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学习中心查找。

相关文章
|
XML 编解码 编译器
Unity跨平台UI解决方案:可能是最全的FairyGUI系列教程-第八天
众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!
1483 0
|
10月前
|
C# 图形学
【unity之c#】所以迭代器的原理知识你还清楚吗?
【unity之c#】所以迭代器的原理知识你还清楚吗?
104 0
|
前端开发 图形学 数据安全/隐私保护
|
前端开发 图形学
|
编解码 前端开发 算法
|
API 图形学 Android开发
Unity跨平台UI解决方案:可能是最全的FairyGUI系列教程-第七天
众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!
917 0
|
前端开发 图形学 Android开发
Unity跨平台UI解决方案:可能是最全的FairyGUI系列教程-第六天
众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!
1486 0
|
XML 前端开发 图形学
Unity跨平台UI解决方案:可能是最全的FairyGUI系列教程-第五天
众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!
390 0
|
XML JSON 缓存
Unity跨平台UI解决方案:可能是最全的FairyGUI系列教程-第四天
众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!
1195 0