目前来说Unity Player的组成大概是UnityEngine + Mono运行时。
UnityEngine提供的是引擎的底层功能,这部分基本是C++实现的。每个目标平台有自己的平台依存代码,每种图形API各自有一个渲染器。(也就是说,基本上每个平台要有一个版本)
Mono( Home | Mono)运行时则是提供了一个跨平台的CLR实现,允许引擎和用户的托管代码运行在每一个目标平台上。Mono自身在开发的时候就是跨平台的,实际上也是对大部分支持的处理器架构分别实现了JIT/AOT引擎。(由于Unity现在支持的平台数大于他们使用的Mono版本,很多后端是Unity自己实现/调整过的)
所以Unity的多平台部署,基本就是用户的托管代码(平台无关)+针对目标平台的Mono运行时+针对目标平台的UnityEngine。用户生成的托管代码(.net Assembly)会在运行时被对应平台的Mono运行时JIT执行。
而Unity对Mono-AOT的利用,目前主要是针对iOS之类不允许运行时生成Native Code的平台,算是一个针对平台安全策略的Workaround。
当然Unity的多平台支持也不是仅仅把编译后的Assembly和Player打个包那么简单,因为对于游戏还有艺术资产的问题。
举例来说,每个平台可能有自己原生支持的音频格式、纹理格式等等。对于这些差异Unity在打包的过程中也会自行吸收掉。所以虽然很多用户看到的多平台发布体验基本上就是简单的右键另存为,但背后Unity还是做了不少工作。
维护十几二十个平台的Mono运行时是个相当麻烦的工作,外加Unity使用的Mono版本老旧,无法支持新的.net特性,性能也不尽人意。因此在未来Unity将会逐步开始引入新的运行时IL2CPP,最终替代大部分平台上的Mono Runtime。(目前已经用在了Unity 5.0的WebGL平台上)
IL2CPP会将CIL编译成C++,然后通过平台SDK的C++编译器编译成对应平台上的原生代码。(至少按照Unity内部测试的结果是这样的)有兴趣的可以参考这篇官方Blog: The future of scripting in Unity,以及Unite 2014的相关Session: https://www.youtube.com/watch?v=Bfa9ILwlsFw(youtube注意)
著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:Mili
链接:https://www.zhihu.com/question/25045484/answer/29945112
来源:知乎
UnityEngine提供的是引擎的底层功能,这部分基本是C++实现的。每个目标平台有自己的平台依存代码,每种图形API各自有一个渲染器。(也就是说,基本上每个平台要有一个版本)
Mono( Home | Mono)运行时则是提供了一个跨平台的CLR实现,允许引擎和用户的托管代码运行在每一个目标平台上。Mono自身在开发的时候就是跨平台的,实际上也是对大部分支持的处理器架构分别实现了JIT/AOT引擎。(由于Unity现在支持的平台数大于他们使用的Mono版本,很多后端是Unity自己实现/调整过的)
所以Unity的多平台部署,基本就是用户的托管代码(平台无关)+针对目标平台的Mono运行时+针对目标平台的UnityEngine。用户生成的托管代码(.net Assembly)会在运行时被对应平台的Mono运行时JIT执行。
而Unity对Mono-AOT的利用,目前主要是针对iOS之类不允许运行时生成Native Code的平台,算是一个针对平台安全策略的Workaround。
当然Unity的多平台支持也不是仅仅把编译后的Assembly和Player打个包那么简单,因为对于游戏还有艺术资产的问题。
举例来说,每个平台可能有自己原生支持的音频格式、纹理格式等等。对于这些差异Unity在打包的过程中也会自行吸收掉。所以虽然很多用户看到的多平台发布体验基本上就是简单的右键另存为,但背后Unity还是做了不少工作。
维护十几二十个平台的Mono运行时是个相当麻烦的工作,外加Unity使用的Mono版本老旧,无法支持新的.net特性,性能也不尽人意。因此在未来Unity将会逐步开始引入新的运行时IL2CPP,最终替代大部分平台上的Mono Runtime。(目前已经用在了Unity 5.0的WebGL平台上)
IL2CPP会将CIL编译成C++,然后通过平台SDK的C++编译器编译成对应平台上的原生代码。(至少按照Unity内部测试的结果是这样的)有兴趣的可以参考这篇官方Blog: The future of scripting in Unity,以及Unite 2014的相关Session: https://www.youtube.com/watch?v=Bfa9ILwlsFw(youtube注意)
著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:Mili
链接:https://www.zhihu.com/question/25045484/answer/29945112
来源:知乎