①可以根据当前硬件情况实时编译生成最优机器指令(ps. AOT也可以做到,在用户使用是使用字节码根据机器情况在做一次编译) ②可以根据当前程序的运行情况生成最优的机器指令序列 ③当程序需要支持动态链接时,只能使用JIT ④可以根据进程中内存的实际情况调整代码,使内存能够更充分的利用
①编译需要占用运行时资源,会导致进程卡顿 ②由于编译时间需要占用运行时间,对于某些代码的编译优化不能完全支持,需要在程序流畅和编译时间之间做权衡 ③在编译准备和识别频繁使用的方法需要占用时间,使得初始编译不能达到最高性能
①在程序运行前编译,可以避免在运行时的编译性能消耗和内存消耗 ②可以在程序运行初期就达到最高性能 ③可以显著的加快程序的启动
①在程序运行前编译会使程序安装的时间增加 ②牺牲Java的一致性 ③将提前编译的内容保存会占用更多的外
Unity的跨平台技术是通过一个Mono虚拟机实现的。而这个虚拟机更新太慢,不能很好地适应众多的平台。
Android下会生成: \assets\bin\Data\Managed\ Assembly-CSharp.dll (游戏的控制逻辑,运行时调用)
\lib\armeabi-v7a\ libmono.so, libmain.so, libunity.so (libmono.so会完成mono VM的功能)
unity公司就自行研发了IL2cpp,把本来应该再mono的虚拟机上跑的中间代码转换成cpp代码,这样再把生成的cpp代码,利用c++的跨平台特性, 在各个平台上通过对各平台都有良好优化的native c++编译器编译,以获得更高的效率和更好的兼容性。 什么是native compiler?什么是cross compiler?
Android下会生成: \assets\bin\Data\Managed\ Assembly-CSharp.dll 一般不打包进apk(游戏的控制逻辑,只作为中间文件存放,运行时不会调用)
\lib\armeabi-v7a\ libil2cpp.so, libmain.so, libunity.so (libil2cpp.so中包含了游戏控制的native code,和IL2CPP VM功能)
①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