unity中c#的底层原理

unity底层运行C#有两种机制:Mono和IL2CPP

1.Mono

C#或者VB这样遵循CLI规范的高级语言,会先被各自的编译器编译成中间语言:IL(CIL),等到需要真正执行的时候,这些IL会被加载到运行时库(CLR),也就是VM中,由VM动态的编译成汇编代码(JIT)然后再执行。

使用Mono的时候,脚本的编译运行如下图所示:

3大脚本被编译成IL,在游戏运行的时候,IL和项目里其他第三方兼容的DLL一起,放入Mono VM虚拟机,由虚拟机解析成机器码,并且执行。

2.IL2CPP

IL2CPP主要由两部分组成:

1.AOT静态编译编译器(il2cpp.exe),将IL转换为C++源码,再交给各平台的C++编译器进行编译,达到平台兼容的目的

2.运行时库(libil2cpp),运行时库则会提供诸如垃圾回收、线程/文件获取、内部调用直接修改托管数据结构的原生代的服务与抽象

使用IL2CPP的时候,脚本的编译运行如下图所示:

在Unity编译打包时,IL2CPP模式同样先将工程中的文件编译为IL,但是IL2CPP不会直接在虚拟机中运行这些IL,而是将工程IL和其他IL一起使用IL2CPP将这些IL变回CPP(C Plus Plus或C++)代码,然后再将C++代码放到本地编译器(具体运行的机器平台的编译器)上编译为能执行的原生汇编代码,再使用自研IL2CPP VM运行。

3.特点对比

优点

缺点

Mono

1.构建应用非常快

2.由于Mono的JIT(Just In Time compilation ) 机制, 所以支持更多托管类库

3.支持运行时代码执行,安卓上dll动态载入程序集热更新

4.必须将代码发布成托管程序集(.dll文件,由mono或者.net生成)

1.维护困难、版权限制,而低版本的mono就无法使用C#的强大特性;
2.mono需要运行在虚拟机内,相比于编译成原生的CPP代码而言,效率非常低

IL2CPP

1.相比Mono, 代码生成有很大的提高

2.可以调试生成的C ++代码

3.程序的运行效率比Mono高,运行速度快

4.可以启用引擎代码剥离(Engine code stripping)来减少代码的大小

5.多平台移植非常方便

1.只支持AOT(Ahead of Time)编译

2.相比Mono构建应用慢

IL2CPP比较适合开发和发布项目 ,但是为了提高版本迭代速度,可以在开发期间切换到Mono模式(构建应用快)。

猜你喜欢

转载自blog.csdn.net/m0_57771536/article/details/127827491