第二章、Mono

上篇说到了Unity3D具有开发语言简单、开发周期短、开发难度低等一系列优点,那么我们该知道为什么。凡事打个问号是一个不错的学习习惯。

  Mono是由Xamarin公司赞助的开源项目,基于Common Language Infrastructure(CLI)语言和C#的ECMA标准,具备了跨平台的能力。听起来很高大尚,但其实这些不重要,我们之前也说到过Unity的底层是C和C++的,这是为了保证引擎的运行效率嘛,但为什么我们开发时用的却是C#脚本语言呢?这就是Mono的强大所在了。Mono由三大部分组成,分别是C#编译器,用来把我们的C#脚本编译成CLI语言;Mono运行时,也可以理解为一种编译器,它负责把C#编译得到的CIL Byte Code 转译成原生代码, 但同时它还具备一些其他功能,比如垃圾回收器。类似于C#中的GC,可以让开发者不用操心内存的释放。但是Mono的垃圾回收性能不如.NET的性能,不过不用关注,知道就行。还有就是基础类库,就是我们开发时用到的各种库。看起来好像也不是很复杂,但真正支撑着我们用C#进行游戏开发的就是这个玩意,其底层逻辑的具体实现无关紧要,但抽象出来一个模型就是,C++在底层写好了一系列的数据处理方法,而Mono运行时则能够编译并存储C#脚本编译后的方法,成为托管,而C++就从Mono这边取出来各种方法进行处理,然后再通过Mono反馈给C#这边,看起来就好像是客服端与服务器之间的交互,但这里交互的方法却完全不同。看到这里你会发现,其实也就那么回事,只要我们不去深究底层的实现,一切都是那么美好!但是!现在不去深究不代表真的不需要去学习这些,只是现在处于入门的阶段,不能好高骛远,先学好怎么用,再学习怎么优化,以至于可能有一天做出自己的引擎来。困难会一个一个地朝你走来,当他发现你不露一丝胆怯时,它便悄然走开。(鸡汤结束)

  除了能够在C#和C++之间完成协调,跨平台也是Unity大红大紫的重要一环,至于具体怎么实现的跨平台,这就是CIL(Common Intermediate Language)通用中间语言的魅力了。CIL指令集可以在任何支持CLI的环境中运行,而各个平台都可以支持CLI的环境,那么我们的项目只要通过Mono编译成CIL代码,这样无论什么平台,只要支持CLI环境,那么你用什么语言来开发就显得不重要了。

  2020.09.29