Unity底层是如何处理C#的

  1. 1. Q1 : Unity的历史里面为什么会选择Mono?
  2. 2. Q2 : Unity为什么又会推出il2cpp?il2cpp到底做了什么事情?
  3. 3. Q3 : il2cpp有哪些优势?

 

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来进行发布,性能会更好