简单理解Unity Mono与IL2CPP

一、

Mono 是跨平台的 .Net Framework 的实现。将 CLR 在所有支持的平台上重新实现了一遍(包含手机上常用的安卓平台和Switch,PS4,这样的游戏机平台),并且mono还将 .Net Framework 提供的基础类库也重新实现了一遍,就是为了解决跨平台的移植问题。


Mono组成组件:C# 编译器,CLI虚拟机,以及核心类别程序库。
Mono的编译器负责生成符合公共语言规范的映射代码,即公共中间语言(Common Intermediate Language,CIL)
在这里插入图片描述

 二、

AOT(Ahead Of Time)、JIT(Just In Time)、Full AOT
JIT即时编译:
从名字就能看的出来,即时编译,或者称之为动态编译,是在程序执行时才编译代码,解释一条语句执行一条语句
AOT静态编译:
其实Mono的AOT静态编译和JIT并非对立的。AOT同样使用了JIT来进行编译,只不过是被AOT编译的代码在程序运行之前就已经编译好了。当然还有一部分代码会通过JIT来进行动态编译。
Full AOT
默认情况下AOT并不编译所有IL代码,而是在优化和JIT之间取得一个平衡。由于iOS平台禁止JIT编译,于是Mono在iOS上需要Full AOT编译和运行。即预先对程序集中的所有IL代码进行AOT编译生成一个本地代码映像,然后在运行时直接加载这个映像而不再使用JIT引擎
在这里插入图片描述

1.构建应用非常快
2.由于Mono的JIT(Just In Time compilation ) 机制, 所以支持更多托管类库
3.支持运行时代码执行
4.必须将代码发布成托管程序集(.dll 文件 , 由mono或者.net 生成 )
5.Mono VM在各个平台移植异常麻烦,有几个平台就得移植几个VM(WebGL和UWP这两个平台只支持 IL2CPP)
6.Mono版本授权受限,C#很多新特性无法使用
7.iOS仍然支持Mono , 但是不再允许Mono(32位)应用提交到Apple Store
 

三、

IL2CPP,顾名思义,就是把IL中间语言转换成CPP文件,这么做的原因有很多,比如说Mono的各个移植很费劲,Mono的版权等等,现在可以在得到中间语言IL后,使用IL2CPP将他们重新变回C++代码,然后再由各个平台的C++编译器直接编译成能执行的原生汇编代码。

在这里插入图片描述

 在这里插入图片描述

1.运行效率快
根据官方的实验数据,换成IL2CPP以后,程序的运行效率有了1.5-2.0倍的提升。

2.Mono VM在各个平台移植,维护非常耗时,有时甚至不可能完成
Mono的跨平台是通过Mono VM实现的,有几个平台,就要实现几个VM,像Unity这样支持多平台的引擎,Mono官方的VM肯定是不能满足需求的。所以针对不同的新平台,Unity的项目组就要把VM给移植一遍,同时解决VM里面发现的bug。这非常耗时耗力。这些能移植的平台还好说,还有比如WebGL这样基于浏览器的平台。要让WebGL支持Mono的VM几乎是不可能的。

3.可以利用现成的在各个平台的C++编译器对代码执行编译期优化,这样可以进一步减小最终游戏的尺寸并提高游戏运行速度。

4.由于动态语言的特性,他们多半无需程序员太多关心内存管理,所有的内存分配和回收都由一个叫做GC(Garbage Collector)的组件完成。

5.虽然通过IL2CPP以后代码变成了静态的C++,但是内存管理这块还是遵循C#的方式,这也是为什么最后还要有一个 IL2CPP VM的原因:它负责提供诸如GC管理,线程创建这类的服务性工作。

6.但是由于去除了IL加载和动态解析的工作,使得IL2CPP VM可以做的很小,并且使得游戏载入时间缩短
 

1.相比Mono, 代码生成有很大的提高
2.可以调试生成的C++代码
3.可以启用引擎代码剥离(Engine code stripping)来减少代码的大小
4.程序的运行效率比Mono高,运行速度快
5.多平台移植非常方便 相比Mono构建应用慢
6.只支持AOT(Ahead of Time)编译

四、

IOS

目前unity只有il2cpp模式的编译才支持64位系统,mono是不支持的。
苹果在2016年1月就要求所有新上架游戏必须支持64位架构,所以必须要选il2cpp。

(机器码被禁止映射到内存,即封存了内存的可执行权限,变相的封锁了jit编译方式)

Android
从2019年8月1日起,在Google Play上发布app必须支持64位体系。从021年8月1日起,Google Play将停掉尚未支持64位体系的APP。
在国内上架应该 32 64 都可以

在这里插入图片描述

IL2CPP比较适合开发完成的上线项目 ,但是为了提高版本迭代速度,可以在开发期间(测试阶段)切换到Mono模式(构建应用快)

猜你喜欢

转载自blog.csdn.net/Star_MengMeng/article/details/126471085