Q1 : Unity的历史里面为什么会选择Mono?
- Mono : 微软.net把.NET标准开放以后,Mono是一个跨平台的.net项目(Linux、Windows、Mac、Android等)
- 我们基于Mono来开发应用、开发游戏引擎、打包发布我们的游戏产品,都是可以跨平台的
- Unity在设计的时候,为了跨平台,就采用了Mono来构建底层(Unity编辑器等)
- 快速地实现Unity编辑器以及Unity开发出来的app能够跨平台(主要原因)
Q2 : Unity为什么又会推出il2cpp?il2cpp到底做了什么事情?
- Mono .net的版权问题
- .net本身也在迭代,每迭代上一个版本的时候都会有授权和版权的问题,这对Unity来说不是一个特别方便的东西,而是一个限制
- Mono虚拟机解释执行.net的字节码,运行效率比较差
- 有些平台不允许内置.net虚拟机,比如IOS
-如果有新的计算平台出现(如XBOX等),Mono又不支持,这时Unity在跨平台上就没用了- 整个Mono是另外一个项目的,如果要把Mono虚拟机移植到一个新的平台,可能要Unity自己动手,这时就会跟Mono主干分开。主干一个分支,Unity一个分支,这时维护起来是非常麻烦的
- 同时一些平台本就不好移植(如WebGL),对Unity而言是非常被动的
这时,Unity推出了il2xxx技术 (xxx包括c++、javascript等)
- IL : .net字节码
- IL2cpp : .net字节码 —> C++代码,再编译,生成native平台相关东西
(1) Unity首先要开发一个C/C++以及native层,来做一个跨平台的Runtime(Xcode, Android NDK,…)
(2) Unity引擎需要把游戏开发者的代码(.net字节码),要开发一个工具(IL2CPP),把它转成C++的代码,这些C++代码基于一些库,结合跨平台的层,生成目标平台的应用程序
(3) C#有垃圾回收机制等,这时C++代码就需要对这些垃圾回收等提供支持。Unity为了提供这些特性的支持,开发了il2cpp vm(实际上是一个runtime库) : 支持C#,.net独有的一些特性,如垃圾回收等
Q3 : il2cpp有哪些优势?
- 跨平台可移植性问题 : Unity本身只需要来移植这个il2cpp就可以了,比较方便
- 解决.net版权问题
- 性能获得提升 : .net是解释执行字节码,il2cpp是把它变成C++代码,其实就是本地的native代码,运行效率会更高一点
- 基本上都是基于il2cpp来进行发布,性能会更好