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

    在上一篇文章中,简要说明了下 Mono 是什么和其组成部分。这一篇文章讲继续说明 Mono 的作用,它与C#脚本之间的关系。

    在说明 Mono 与C#脚本的关系之前,有必要提一提各种编程语言的差别以及游戏开发的既往史。如果以速度作为衡量语言级别的标准,语言从低级到高级大概排名如下:

1 汇编语言。

2 C/C++, 编译型静态不安全语言。

3 C#、Java,编译型静态安全语言。

4 Python、JavaScript,解释型动态安全语言。

    在以上排名中,C/C++属于中低级语言,它们与汇编语言一样可以更加直接地与硬件打交道,因而具备更优异的效率,而如 C#以上的高级语言则不然。令人沮丧的是,如 C/C++这种高效率的低级语言虽然入门容易,但是进阶难,其高级特性和高度灵活性也会带来高风险,这样使得开发难度高,开发效率低,开发成本也随之增加。

    在过去在开发游戏时,常常只会采用一种编程语言,这个时候游戏开发者往往会面临一个两难的选择,到底是使用高效率的低级语言还是低效率的高级语言来进行开发。语言选择合适与否,可能直接关系到游戏开发的成与败。在以往单机游戏流行的年代,硬件水平相对低下,为了尽可能压榨硬件性能,多采用 C/C++来进行开发。而随着硬件水平的提高,压榨硬件性能的需求已经不再那么迫切,取而代之的是:网游的兴起对开发速度以及版本迭代提出更高的要求。开发效率并不高,且投资巨大、风险很高的 C/C++慢慢不再适应市场需求。更加现实的问题是:相比难以掌握的 C/C++语言,更容易被掌握的 Java、.Net甚至是 JavaScript 被更多的程序员所选择,C/C++程序员所占比例越来越小。而网游市场的不断扩大对人才的需求也越来越大, 这样就造成了大量的人才空缺,也就反过来提高了使用 C/C++开发游戏的成本。面对这一困境,游戏脚本应运而生。在游戏中使用脚本,不经解决了 C/C++难以精通带来的开发效率低的问题,也降低了使用C/C++进行项目开发的风险和成本。相比使用 C/C++,使用脚本语言开发游戏,具有易于学习,代码维护方便,开发成本低的优势。慢慢地,使用脚本已经成为了游戏开发中不可或缺的一部分。Unity 使用 C#作为游戏脚本语言(在Unity2017版本以前,还使用了Boo 语言和 Unity 开发的一种基于 Boo的一种叫做 UnityScript 语言作为脚本语言,在2017版本后移除了另外两种语言的支持,只留下了 C#作为唯一的脚本编写语言)。

那么使用 C/C++开发应用与使用脚本开发应用有什么不同呢,下图给出了两者应用的结构:

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

脚本机制的出现,使得游戏开发时在到底是选择高效的低级语言还是低效的高级语言之外多了另一种平衡两者的选择。脚本机制融合了两者的优点,由经验丰富的开发人员使用 C/C++开发应用引擎,而具体功能的实现,如 UI 、交互等则使用高级语言开发。通过使用高级脚本语言,开发者不必担心C/C++开发的引擎中具体实现的细节,也无需关注资源管理和内存管理的这些细节,提高了开发效率和风险,还能获得不俗的运行速度。

    Mono提供了这种脚本机制实现的可能,它将脚本语言通过 JIT 编译为原生代码,提高了脚本语言的效率,同时还提供了很多方便调用原生代码的接口。Mono 在此充当了脚本语言与低级语言之间交互的桥梁。要想通过Mono 实现脚本语言与低级语言的交互,那么就必须将 Mono 运行时嵌入应用中。因为 Unity 本身就是使用 C++写成的,下图以就Unity 为例进行展示:

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

 Mono 嵌入 Unity 的过程分为3个步骤1: 编译 Unity 程序和链接 Mono 运行时。2:初始化 Mono 运行时。3:Unity 的 C/C++代码与 C#/IL的交互,其具体过程比较复杂,这里不做具体介绍。

 当 Mono运行时嵌入 Unity 之后,Unity的 C/C++代码 与C#代码之前就可以通过句柄来进行交互了。C/C++可以获取 C#方法的MonoMethod 句柄并调用该方法。而在C#脚本文件中调用 C/C++代码时,则是在 C#文件中定义与 Unity 引擎的 C/C++代码中结构对应的类来作为接口,通过对接口的调用来实现对 C/C++的调用。在 C#的代码中,只提供接口,并不提供具体逻辑的实现。类的对象构建工作最终还是移交给了 C/C++代码。

    可以看出 C#脚本是通过 Mono 先被编译成 IL(中间语言),接着这些IL会在 Mono 运行时中通过 JIT进一步被编译成原生代码并执行的。而脚本机制的使用,则使得原本需要通过复杂的 C/C++编写代码实现的部分功能,也能通过高级语言编写脚本来实现。Mono 即在这一过程中作为脚本模块的基础,提供了这种脚本功能。

PHP开发、web前端、UI设计、VR开发专业培训机构--VIT学院版权所有,转载请注明出处,谢谢合作!