一.导入
Unity的脚本资源是以dll文件的方式存在于磁盘上,在Unity中进行打包时,有两种打包方式选择:Mono和IL2CPP:
二.Mono和IL2CPP
1.指令集位数:Mono只支持打包为32位指令集(使用32位指令集的计算机内存最大只有4G);IL2CPP支持64位(兼容32位)。
2.打包后文件区别:Mono打包后文件中存在大量动态链接库文件(.dll后缀文件),也包括mono虚拟机文件(libmonobdwgc-2.0.so和libMonoPosixHelper.so),在运行程序时dll文件会加载到mono虚拟机中;IL2CPP打包后没有了dll文件,Unity主工程的dll文件(Assembly-CSharp.dll)和Mono虚拟机文件集成为IL2CPP虚拟机文件(libil2cpp.so)。
3.脚本编译流程:
1)Mono方式:在Unity编译打包时,使用C#书写的脚本会经过Mono的C#编译器打包为中间语言IL(Intermediate Language,IL语言所在的文件就是.dll后缀的文件),然后和其他dll文件一起在Mono虚拟机(Mono VM,Mono Virtual Machine)中运行。中间语言IL的存在主要是为了平台的兼容性,因为不同指令集平台执行同样的程序的具体机器语言并不是相同的,如果打包时直接将程序翻译为机器语言,那么打包后的程序包就只能在指定平台上运行,所以我们在打包时先将程序编译为中间语言IL,在不同的平台上使用Mono虚拟机将IL相应地翻译为该平台的机器语言执行。
2)CLR:Common Language Runtime,公共语言运行时;CLI:Common Language Infrastructure,公共语言基础结构;CIL:Comoon Intermediate Language,公共中间语言;CLI = CLR + CIL;Mono:基于CLR的开源项目,允许引擎和用户的托管代码运行在每一个目标平台上。
3)Mono虚拟机运行CIL的3种方式:
JIT:Just In Time,在编译时将C#编译为CIL,在运行时逐条读入逐条翻译为原生码交给CPU执行;
AOT:Ahead Of Time:在编译为CIL后,先将CIL预先编译为原生码,运行时直接交给CPU执行。AOT模式一般只处理部分CIL,剩余部分采用JIT模式运行;
Full AOT:使用AOT模式处理所有CIL。
4)IL2CPP方式:在Unity编译打包时,IL2CPP模式同样先将工程中的文件编译为IL,但是IL2CPP不会直接在虚拟机中运行这些IL,而是将工程IL和其他IL一起使用IL2CPP将这些IL变回CPP(C Plus Plus或C++)代码,然后再将C++代码放到本地编译器(具体运行的机器平台的编译器)上编译为能执行的原生汇编代码,再使用IL2CPP VM运行。
5)IL2CPP的编译方式:只支持AOT方式
6)平台支持:Android平台支持Mono和IL2CPP的所有编译方式,而IOS只支持Mono的Full AOT模式和IL2CPP 。