学习笔记之Unity跨平台原理

  1. Mono虚拟机包含一个实时编译引擎,该引擎可用于如下处理器: x86, SPARC, PowerPC, ARM, S390 (32位模式和64位模式), x86-x64, IA64和64位模式的SPARC.该虚拟机可以将代码实时编译或者预先编译到原生代码.对于那些没有列出来的系统,则使用的是代码解释器. 

  2. Unity的跨平台,就是通过Mono将C#脚本代码编译成CLI(Common Language Infrastructure,通用语言基础结构),然后Mono运行时利用JIT(Just-in-Time compilation,即时编译)或者AOT(Ahead-of-Time,提前编译或静态编译)将CLI编译成目标平台的原生代码实现的。

  3. 其实现原理在于使用了叫CIL(Common Intermediate Language通用中间语言,也叫做MSIL微软中间语言)的一种代码指令集,CIL可以在任何支持CLI(Common Language Infrastructure,通用语言基础结构)的环境中运行,就像.NET是微软对这一标准的实现,Mono则是对CLI的又一实现。由于CIL能运行在所有支持CLI的环境中,例如刚刚提到的.NET运行时以及Mono运行时,也就是说和具体的平台或者CPU无关。这样就无需根据平台的不同而部署不同的内容了。代码的编译只需要分为两部分就好了:(1)从代码本身到CIL的编译(其实之后CIL还会被编译成一种位元码,生成一个CLI assembly)   (2) 运行时从CIL(其实是CLI assembly,不过为了直观理解,不必纠结这种细节)到本地指令的即时编译(这就引出了为U3D官方没有提供热更新的原因:在iOS平台中Mono无法使用JIT引擎,而是以Full AOT模式运行的,所以此处说的额即时编译不包括IOS)

  4. Net运行时和Mono运行时,也就是说CIL语言其实是运行在虚拟机中的,具体到U3D也就是mono的运行时了,换言之mono运行的其实CIL语言,CIL也并非真正的在本地运行,而是在mono运行时中运行的,运行在本地的是被编译后生成的原生代码。 

猜你喜欢

转载自blog.csdn.net/qq_29382635/article/details/81136946