文章目录
- AOT编译是什么,可以只用AOT编译吗?
- 完全静态编译是什么,有什么特点?
- Unity打包到各个平台时,使用哪些编译方式?
- Unity使用哪种GC方式?
- 什么是托管代码和非托管代码?
- Mono用的好好的,为什么需要IL2CPP机制?
- 总结
AOT编译是什么,可以只用AOT编译吗?
- AOT编译就是在程序运行前将IL转译成机器码存储在文件中进行编译
- 适用于
绝大部分JIT产生的机器码情况,但有部分仍然只能靠JIT编译产生机器码,比如控管监督相关的代码
完全静态编译是什么,有什么特点?
- 基于AOT编译模式更进一步产生所有的机器码的编译方式
- 可以让程序在
运行期完全不需要用到JIT,适用于不允许使用JIT的操作系统,比如IOS
Unity打包到各个平台时,使用哪些编译方式?
- 打包到IOS平台,使用完全静态编译
- 打包到Android和Windows平台,使用JIT实时编译来运行代码
Unity使用哪种GC方式?
- 主要是Boehm-GC,书中提到的SGen-GC是从Mono运行时自身的GC发展历史来说的
什么是托管代码和非托管代码?
- C#代码生成的IL编码就是托管代码,由虚拟机的JIT编译执行,对象无须手动释放,由GC管理
- C/C++或C#中以不安全类型写的代码是非托管代码,虚拟机无法跟踪到这类代码对象
Mono用的好好的,为什么需要IL2CPP机制?
- 维护成本过大。Unity的Mono虚拟机有自己的修改方案,需要自己维护虚拟机程序,导致Unity在各个平台移植时工作量巨大,甚至不可能完成
- Mono版本授权受限。Mono版本无法升级,很多C#新特性无法使用,而换成IL2CPP则可以开发一套组件解决问题
- 提高运行效率,换成IL2CPP后有了1.5~2倍效率提升
总结
本小节主讲编译,Unity的Mono与IL2CPP关系