unity中的AOT、JIT、IL2CPP、Mono

一、JIT、AOT是什么

JIT,即Just-in-time,动态(即时)编译,边运行边编译;AOT,Ahead Of Time,指运行前编译,是两种程序的编译方式

二、优劣

JIT优点:

①可以根据当前硬件情况实时编译生成最优机器指令(ps. AOT也可以做到,在用户使用是使用字节码根据机器情况在做一次编译)
②可以根据当前程序的运行情况生成最优的机器指令序列
③当程序需要支持动态链接时,只能使用JIT
④可以根据进程中内存的实际情况调整代码,使内存能够更充分的利用

JIT缺点:

①编译需要占用运行时资源,会导致进程卡顿
②由于编译时间需要占用运行时间,对于某些代码的编译优化不能完全支持,需要在程序流畅和编译时间之间做权衡
③在编译准备和识别频繁使用的方法需要占用时间,使得初始编译不能达到最高性能

AOT优点:

①在程序运行前编译,可以避免在运行时的编译性能消耗和内存消耗
②可以在程序运行初期就达到最高性能
③可以显著的加快程序的启动

AOT缺点:

①在程序运行前编译会使程序安装的时间增加
②牺牲Java的一致性
③将提前编译的内容保存会占用更多的外

三、与unity关联

1、JIT & Mono编译

Unity的跨平台技术是通过一个Mono虚拟机实现的。而这个虚拟机更新太慢,不能很好地适应众多的平台。
Mono编译流程

Android下会生成:
\assets\bin\Data\Managed\ Assembly-CSharp.dll (游戏的控制逻辑,运行时调用)

\lib\armeabi-v7a\ libmono.so, libmain.so, libunity.so (libmono.so会完成mono VM的功能)

2、AOT & IL2CPP编译

unity公司就自行研发了IL2cpp,把本来应该再mono的虚拟机上跑的中间代码转换成cpp代码,这样再把生成的cpp代码,利用c++的跨平台特性,
在各个平台上通过对各平台都有良好优化的native c++编译器编译,以获得更高的效率和更好的兼容性。
什么是native compiler?什么是cross compiler?
ILL2CPP编译流程

Android下会生成:
\assets\bin\Data\Managed\ Assembly-CSharp.dll 一般不打包进apk(游戏的控制逻辑,只作为中间文件存放,运行时不会调用)

\lib\armeabi-v7a\ libil2cpp.so, libmain.so, libunity.so (libil2cpp.so中包含了游戏控制的native code,和IL2CPP VM功能)

3、IL2CPP相比Mono的优势

①Mono VM在各个平台移植,维护非常耗时,有时甚至不可能完成
②Mono版本授权受限
③提高运行效率
④有了IL2CPP,程序尺寸可以相对缩小,运行速度可以提高!
⑤使用了IL2CPP在堆内存分配方面和Mono 相比,Reserved Total 是可以下降的,而 Mono的 Reserved Total 只会上升不会下降。

相关链接:https://blog.csdn.net/h1130189083/article/details/78302502
相关链接:https://www.cnblogs.com/eniac1946/p/7417191.html
相关链接:https://zhuanlan.zhihu.com/p/19972689

猜你喜欢

转载自blog.csdn.net/cgExplorer/article/details/107029630