Mono虚拟机:
Mono作为.Net平台的开源项目,支持Linux,Windows,Mac和Android。所以基于Mono开发的应用程序都是可以跨平台发布。其跨平台的特性也是Unity选择Mono的原因。
编译流程:
Unity编译打包时,使用C#编写的脚本会通过Mono的C#编译器打包成IL(中间语言),然后在Mono的虚拟机中运行。
IL的存在是为了兼容不同平台,因为在不同指令集在平台上执行同样的程序的机器语言并不相同,若打包的时候直接将程序翻译成机器语言,则出的包只能在指定平台运行,所以打包的时候先编译成IL,在不同的平台上使用Mono虚拟机(JIT)将IL翻译成对应平台的机器语言。
优点:
构建速度快
支持运行时代码执行
缺点:
多平台移植麻烦。
受限于Mono版本。
IL2CPP:
因为Mono官方的虚拟机并不能满足Unity多平台的需求,所以后来引入了IL2CPP。
IL2CPP主要由两部分组成:
AOT:将IL转换成C++源码,然后通过不同平台的C++编译器编译,实现多平台兼容。
运行时库(libli2cpp):支持IL2CPP虚拟机运行,可以提供GC,线程获取,文件获取,内部调用直接修改托管堆数据结构的。
优点:
运行效率快。
方便多平台移植。
可以在相应的平台使用C++编译器对编译器代码进行优化。
缺点:
相对于Mono的构建速度慢。
只支持AOT编译。