Unity引擎编译后的程序是如何运行在iOS和Android上

本文深入探讨了Unity引擎如何通过UnityEngine提供底层功能、Mono运行时实现跨平台托管代码执行,以及如何处理不同平台间的差异,最终实现多平台高效部署。同时,文章还展望了IL2CPP技术在未来替代Mono运行时的趋势,以及Unity如何优化打包过程以适应各种平台需求。
摘要由CSDN通过智能技术生成

目前来说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: youtube.com/watch?(youtube注意)
著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:Mili
链接:https://www.zhihu.com/question/25045484/answer/29945112
来源:知乎
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值