说说Mono 与 Unity 的关系(一)(V客学院知识分享)

     众所周知,Unity 是一个基于组件式编程的游戏开发引擎,其为开发者提供了很多功能强大的组件。我们知道尽管在通过脚本操作Unity 组件的过程中,Unity 有自己的实现和技术,但归根结底,Unity 还是利用了 Mono 运行时来实现其脚本模块的基础。那么,Mono 究竟是什么,又与 Unity 之间有何关系呢?本节将说一说 Mono 到底是什么。
     Mono 究竟是什么 ?
     Mono是一个由Xamarin公司所主持的自由开放源代码项目。它基于通用语言架构(Common Language infrastructure ,缩写 CLI)和 C#的 ECMA标准(Ecma-334和Ecma-335),提供了微软.NET的另一种实现方式。与微软的.NET Framework(共通语言运行平台)不同,Mono项目不仅可以运行于Windows系统上,还可以运行于Linux,FreeBSD,Unix,OS X和Solaris,甚至一些游戏平台,例如:Playstation 3,Wii或XBox 360。 看到这里,大伙应该知道为什么 Unity 能够实现跨平台了,没错,这归功于 Mono。不过,在即将发布的 Unity2018版本中,Unity 将不再使用 Mono,而采用.NET Core来实现跨平台了。
       Mono组成的主要组件包含了C#编译器、Mono运行时、基础类库、Mono 类库。
       C#编译器。 目前最新的 Mono 版本为5.10.1,新版本的Mono的 C#编译器完全兼容 C#1.0至5.0,但由于历史原因,目前所发布的 Unity 的正式版本中,采用的 Mono 版本仍然为2.x 的版本,C#4.0以后的一些新功能,在Unity 中得不到支持。Mono 2.11版本以前,采用过多个编译器,从2.11版本开始,采用了一个统一的编译器——mcs。由于mcs 是 C#编写的,而且使用了很多.NET的 API,在非 WIndow 平台上需要使用 Mono 运行时来运行 mcs。但在 Windows 平台上,既可以使用微软的.NET运行时,也可以使用 Mono 运行时。mcs 的作用是将 C#编译成为 ECMA CIL 的 中间语言。
        Mono 运行时。由 C#编译器将 C#代码编译为中间语言后,再交由 Mono 运行时,Mono 运行时提供一个及时编译器(Just-in-time,缩写 JIT),在程序运行过程中,JIT会将中间语言再转译为对应平台原生码,这就是 Mono 提供3中种转译方式中的一种——即时编译。计算机能识别并执行的就是这些转译后的原生码,而中间语言和 C#源码,计算机是无法直接识别并执行的。通常情况下,Mono 的工作流程会为以上的过程。但 Mono 运行时还提供了另一种编译器——提前编译器(Ahead-of-time,缩写 AOT)以及另外两种转译方式——提前编译(Ahead-of-time)和完全静态编译(Full-ahead-of-time,缩写为 Full-AOT)。提前编译是在程序运行之前,将.exe或者.dll文件中的部分中间语言转译为目标平台原生码并储存起来,但仍有部分中间语言会需要在运行时进行转译,即需要JIT 编译。完全静态编译则是在运行之前,所有代码已经被完全编译为目标平台的原生码,在程序运行过程中是不允许使用 JIT 编译的,在 Unity 开发中,对 IOS 平台的开发就是采用的这样一种编译模式。Mono 运行时除提供以上两种编译器和转译模式外,还提供一个非常重要的功能——垃圾回收器(Garbage Collection,缩写 GC)。GC 的使用,使得开发人员无需去手动管理内存,专注于业务逻辑的开发,而使得开发难度降低,提高开发效率。然而使用 GC 在获得便利的同时,也会带来一些性能上的损耗。毕竟 GC 在运行中对目标对象的追踪,以及决定是否回收对象内存时,是需要消耗计算机资源的。在 Unity 开发过程中,对于如何避免频繁触发 GC 一直是游戏优化过程中一个老生常谈的问题。Mono 的垃圾回收机制与微软.NET 框架的不同,在 Mono2.8版本前后,它有两套不同的垃圾回收机制——分代回收(Generational Collector)和贝姆垃圾收集器(Boehm -Demers-Weiser Garbage Collector)。Mono 早期版本所采用贝姆垃圾收集器与微软.NET框架的垃圾回收器相比一直有很大的限制,而Unity 是采用的开源的 Mono,是比较早期的 Mono 版本。因此 Unity的垃圾回收性能比不上.NET的垃圾回收性能,这估计也是 Unity 官方会在2018版本放弃 Mono 而转投.NET Core的一个重要原因吧。
        下一节将说一说 Mono 和 C#脚本的关系以及 Mono如何实现 在 C#代码与 Unity 的 C++代码交互的。
PHP 开发、 web 前端、 UI 设计、 VR 开发专业培训机构 --V IT 学院版权所有,转载请注明出处,谢谢合作!     

猜你喜欢

转载自blog.csdn.net/aiaihus/article/details/80101240