Unity引擎编译后的程序是如何运行在iOS和Android上的?
不是很系统的了解这里的原理。请了解的朋友解答一下。 @vczh 虽然没有具体说细节,但是大体的概念是对的。平台/系统之间的差异总是要有人通过开发中间层来吸收,关键只是在于谁来做这个工作而已。
目前来说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注意)
第一次回答,如果内容有任何问题欢迎指出…… 技术上看,关键点大致就是这些:
1. mono实现了基本的CLI库,和.net的编译环境。这样用户编写的.net代码可以直接编译成平台无关的bytecode
2. 针对具体平台,unity通过P/Invoke的方式实现了一系列专有类和接口函数,用来访问平台特定的资源。
3. 对于每一个平台,unity提供了一个应用的外壳,用来封装和引导以bytecode形式存在的用户代码。用户可以直接发布封装好的应用。
其实跨平台的基本原理并不复杂,主要难度还是针对具体平台的实施和优化。 c#的话
http://www.mono-project.com
而unity恶搞的JavaScript是可以编译的
页:
[1]