找回密码
 立即注册
查看: 752|回复: 10

[简易教程] Unity3d跨平台原理是什么?

[复制链接]
发表于 2021-4-25 09:35 | 显示全部楼层 |阅读模式
Unity3d是如何实现跨平台的,是基于mono的吗?那它如何保证所有的平台上都安装了mono运行时?如果不是,那又是如何实现跨平台的?
发表于 2021-4-25 09:38 | 显示全部楼层
这个问题似乎有点久远了,不过没关系,最近正好给团队做了一次IL2CPP的普及,顺便来回答一下吧。
1、说到跨平台不得不说的一个东西叫做CIL(Common Intermediate Language)通用中间件语言,
这是一个在.net FrameWork框架下的中间件,是一个大家公认的标准,可以理解为低阶的,人类可读的语言。由于早期的.net不开源,所以Xamarin当时就主持开发了一个开源的代码工具,目的就是把CIL从微软的.net平台解放出来,变为通用的与平台无关的运行环境。概念上可以把mono的VM理解为java的VM。
2、Unity早期的版本是支持很多种开发语言的,比如BOO、UnityScript、C#等。但是由于C#强大的特性,逐渐淘汰了其他两种,现阶段几乎都由C#进行开发。而原理也都很简单,不管你用哪种前台语言,最终都会被编译成IL。
3、一个完整的MONO编译运行流程大致如下,最终它们会跑在指定的MONO VM之中。
4、那既然VM已经能实现跨平台了,为何现在的Unity版本需要全面放弃MONO,转而使用IL2CPP呢?
5、Unity使用Mono虽然解决了跨平台的难题,但是也引入了更多的难题。比如对于VM的维护。这也是题主所提到的,有多少平台就需要维护多少个平台的VM。这是一个非常耗时耗费精力的工程,尤其在于Unity自身版本需要不停更新迭代的同时,再去维护老旧的VM虚拟机的升级与BUG相当困难。
除此之外,虽然Mono本身是开源的,但是商业使用还是收到一定的版权限制,而低版本的MONO就无法使用C#的强大特性,如果做Unity开发的同学应该知道,前些年,只能使用Mono2.x的版本,导致非常多的C#代码无法实现。
最后,因为MONO需要运行在虚拟机内,相比于编译成原生的CPP代码而言,效率非常低。
还有一个问题是谷歌64位版本问题,MONO也无法解决。
6、效率的差异主要来自于两种编译技术,一种是JIT,一种是AOT。这个详细技术可以自行搜索,略过。
7、现阶段Unity所使用的过渡方案是IL2CPP,它的原理也很简单,大概就是在IL代码之后,再进行一次转译,将其转化为Cpp代码,然后再利用不同平台的优化过的编译器,编译为对于平台的目标代码。
这里要稍微注意的一个东西是IL2CPP VM。不是说都编译成CPP代码了吗?怎么还要虚拟机?严格来说,这不是一个虚拟机,而是一个简易的内存管理器。毕竟MONO使用的是内存托管机制,工具虽然可以翻译代码,但是翻译不了机制。所以这里的VM可以理解为运行时的内存管理器。


最后,IL2CPP只是Unity的过渡方案,真正Unity想做的是Burst。这个涉及到LLVM和后端编译,内容很大,不细说。我的另一篇文章里有对此的粗略描述。
放牛的星星:Unity手游实战:从0开始SLG——ECS战斗(六)Unity面向数据技术栈(DOTS)也欢迎关注我的教程集合帖。
放牛的星星:[教程汇总+持续更新]Unity从入门到入坟——收藏这一篇就够了

------------------------------11月9号更新----------------------
过了一个周末,收到了很多赞赏,有些朋友在评论里提到了Mono64其实可以解决64位的问题,这里再更新一下对于这个问题的阐述,之所以Unity没有继续使用Mono来解决谷歌64为版本的问题,主要是因为针对ARM64运行时不开源,并且没有授权许可,同时也明确表示以后也不会支持。
这个决策很容易理解,虽然IL2CPP是过渡方案,但是基本上能从根上解决需要不停的维护无限多个MONO虚拟机的问题。
另外,还有朋友私信提到,跨平台原理是不是还应该提一提图形方面的,毕竟不同平台的图形接口都不一样,这里大家也会好奇的。
好吧,我先准备一下,空了更新上来。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2021-4-25 09:48 | 显示全部楼层
所有的平台打包程序里带个mono runtime,ios之外的平台是jit,ios平台是编译时把IL代码转为目标码,也就是Full AOT。

总的来说,跨平台目前确实靠mono。
发表于 2021-4-25 09:54 | 显示全部楼层
mono只是让用户写的C#、JS等语言只要写一遍,就可以发布到unity3d支持的平台上。整个Unity3d的跨平台,涉及到很多方面。譬如,渲染层采用OpenGL,可以实现在各个平台上的通用。但是因为考虑到DX在很多支持的平台上的优越性,用户会用的着,所以也得支持。为了实现这块的跨平台,必须有相关的中间层支持来把这块帮用户做掉,实现渲染层的跨平台。其他的,物理引擎,采用第三方的,也得选择在各个平台上都支持的。其他各个模块也类似,必须寻找在各个平台上都支持的,或者是基于C++、C等能在语言层次跨平台的,然后通过编译出不同的平台上的中间件来支撑整个引擎。
发表于 2021-4-25 10:02 | 显示全部楼层
Unity 3D跨平台是基于开源.net 平台 Mono来实现的。.net是微软提供的一个概念,核心意涵就是C#, J#等编程语言开发项目,.net开发工具将这些语言的代码编译成.net 虚拟机的字节码。C#.net字节码,J#转.net字节码, 微软把.net的虚拟机内置到微软家族的操作系统里面(Windows, WinPhone等),并开放出.net的标准。Mono是一个开源的代码框架,他的目标就是要基于.net标准来实现跨平台.net虚拟机与开发工具,支持Linux, Windows, android, IOS等。所以Unity跨平台选择Mono, Unity是基于Mono框架下开发出来的跨平台的游戏引擎。iOS下有点不一样,Unity会通过IL2CPP 将.net代码转成C++代码来编译成iOS版本的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2021-4-25 10:09 | 显示全部楼层
1. 基于mono
2. 打包的时候把mono 打进去了
发表于 2021-4-25 10:16 | 显示全部楼层
Unity3D实现原理在于使用了叫CIL(Common Intermediate Language通用中间语言,也叫做MSIL微软中间语言)的一种代码指令集,CIL可以在任何支持CLI(Common Language Infrastructure,通用语言基础结构)的环境中运行,就像.NET是微软对这一标准的实现,Mono则是对CLI的又一实现。由于CIL能运行在所有支持CLI的环境中,例如刚刚提到的.NET运行时以及Mono运行时,也就是说和具体的平台或者CPU无关。这样就无需根据平台的不同而部署不同的内容了。所以到这里,各位也应该恍然大了。代码的编译只需要分为两部分就好了嘛:
    从代码本身到CIL的编译(其实之后CIL还会被编译成一种位元码,生成一个CLI assembly)运行时从CIL(其实是CLI assembly,不过为了直观理解,不必纠结这种细节)到本地指令的即时编译(这就引出了为何U3D官方没有提供热更新的原因:在iOS平台中Mono无法使用JIT引擎,而是以Full AOT模式运行的,所以此处说的额即时编译不包括IOS)
具体如何实现,可以参考下文Unity3d跨平台原理介绍
发表于 2021-4-25 10:26 | 显示全部楼层
在业务层面,或者某些api层面,比如图形api,Shader做一层抽象设计,然后按照这个设计,每个平台做一个实现。所以所谓的跨平台,其实是引擎帮你把每个平台的工作都做了。这就是引擎的价值。
从本质上说,引擎提供的是一种外包服务。这种外包服务是一种预制的服务,而不是定制服务。你购买了引擎,相当于你购买了这种外包服务。
发表于 2021-4-25 10:36 | 显示全部楼层
Unity的跨平台不可能单纯的归属到mono。
这需要从如下几个方面去描述它的跨平台能力的设计思路。
其一,Unity Runtime,其实质就是C++代码,通过不同的平台进行交叉编译生成对应平台的可识别的lib,从而提供你基础底层引擎。
其二,脚本语言mono,Unity通过C#作为与其C++进行交互的主体语言,也是我们开发Unity时使用的默认语言选项。具体的原理其他回答说的很详尽了没必要描述。
其三,RHI,即对底层Graphic驱动的高级抽象封装,让Unity的Runtime可以根据目标平台使用对应的Graphic API进行图像绘制。
另外,Unity提供了il2cpp,其通过分析C#的il指令,生成对应的C++文件,然后通过交叉编译生成目标平台文件得以实现跨平台能力。
发表于 2021-4-25 10:40 | 显示全部楼层
这个跟lua不是一个道理吗,你要使用lua,自然要带上lua虚拟机。 然后你要了解iOS平台的限制,才能理解why AOT
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-20 14:12 , Processed in 0.163288 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表