unity中的AOT、JIT、IL2CPP、Mono

本文详细对比了JIT(即时编译)与AOT(预编译)两种程序编译方式的优劣,并结合Unity游戏引擎的跨平台技术,探讨了Mono与IL2CPP编译方式在游戏开发中的应用及优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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

05-22
### 关于C#的AOT(Ahead-of-Time)编译技术 C# 的 AOT 编译是一种将 C# 源代码转换为本地机器码的技术,从而绕过即时编译器(JIT),提高应用程序启动速度并减少运行时开销。这种技术特别适用于嵌入式设备、移动应用以及需要高性能的应用场景。 #### 什么是AOTAOT 是一种编译方法,在此过程中,源代码被完全翻译成目标平台上的原生二进制文件[^4]。这意味着当程序执行时,不需要再通过 JIT 将中间语言(IL)转化为本机代码。这不仅减少了首次加载时间,还消除了动态内存分配中的潜在安全风险。 .NET 平台支持多种方式实现 AOT 编译: 1. **Native AOT**: Native AOT 提供了一种全新的构建模型来创建自包含应用程序,并将其直接编译成本地可执行文件。它利用 `crossgen` 工具链完成这一过程,该工具可以预先生成元数据和 IL 到本机映射表[^5]。 2. **Unity 和 Xamarin 使用的 AOT 技术**: Unity 游戏引擎与 Xamarin 移动开发框架广泛采用了 AOT 方法。例如,在 iOS 上部署 Mono 应用程序时,默认情况下会启用 AOT 编译模式因为 Apple 不允许解释型脚本或者 JIT 运行环境存在于其 App Store 中[^6]。 以下是简单的例子展示如何配置项目以使用 Native AOT: ```xml <!-- Project File --> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net7.0</TargetFramework> <PublishAot>true</PublishAot> </PropertyGroup> ``` 以上 XML 片段展示了设置 .NET Core 或更高版本项目的属性组部分,其中 `<PublishAot>` 参数指示是否开启发布阶段下的 AOT 功能[^7]。 需要注意的是,尽管 AOT 带来了诸多好处,但也存在一些局限性和挑战: - 需要更多的磁盘空间存储预编译后的大型库; - 可能增加构建时间和复杂度; - 对反射的支持有限,某些依赖反射的功能可能无法正常工作[^8]。 因此,在决定采用哪种类型的编译策略之前,开发者应仔细权衡这些因素的影响。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值