【Unity】Mono相关理论知识学习
一种编译技术。
优点:
- 支持JIT编译:在运行时将IL编译成机器码。首次执行稍慢,好处在于运行更快,迭代更高效。
- 构建速度快:无需将IL转成C++,构建过程省去了IL2CPP的转换和原生编译步骤,适合开发阶段快速阶段测试和构建。
- 调试体验优秀:支持热重载、断点调试、变量查看、Call Stack等功能.
- 构建包体小:没有庞大的C++生成代码和原生库,在某些平台(如PC)可以获得更小的包体。
- 兼容性好:Mono支持大部分的C#功能和.NET API。
- 适用于某些平台:Unity编辑器就是跑在Mono上,很多的开发工作流程都是基于Mono。
缺点:
- JIT导致的平台限制:iOS平台禁止使用JIT——Mono无法用于iOS发布。
- 运行性能差于IL2CPP:由于Mono是JIT形式,因此无法提前进行深度优化,在移动端、嵌入式设备等场景中的性能会明显弱于IL2CPP,特别是启动时间和内存分配效率。
- 可逆性高,安全性差:Mono使用IL文件运行,容易被反编译。
- GC垃圾回收效率相对较低:Mono的Mono GC(Boehm GC)在大内存或高频率分配场景下的效率较差,IL2CPP提供的UnityGC
- 对新语言的支持有限:Unity的旧版Mono运行时不支持最新的C# 8 / 9特性,例如异步流、模式匹配增强。
Mono构建Unity项目流程:C#源码 --> 用C#编译器编译成中间语言IL--> 生成 .NET DLL。
Mono打包后的结果是:生成.Net IL,存储在.dll文件中,属于一种字节码格式,不是原生的机器码。
Mono是一个虚拟机,在运行是动态读取IL字节码并执行,执行方式分两种:
1. (默认)JIT模式:
Mono会在程序运行时将IL转换为机器码(本地指令),然后执行,对应的机器码由当前平台(Windows/Android)的CPU架构生成。
2. (可选)解释执行模式:
Mono也可以直接逐条解释执行IL(性能较差,一般用于调试/嵌入设备)。