CS5L2——Unity跨平台的基本原理之Mono

主要内容

  1. Unity和Mono的关系
    利用Mono实现Unity上层逻辑的跨语言和跨平台
  2. Unity跨平台的必备概念
    Unity底层是C/C++,上层逻辑支持多语言(目前只用C#)
    Mono的基本构成有C#编译器、Mono运行时(虚拟机)、各种类库等
  3. Unity跨平台的基本原理(Mono)
    将基于CLI公共语言基础规则的语言编译成CIL公共中间语言,再通过Mono VM(虚拟机) 将其在各操作系统中转译为原生机器码进行运行
  4. 基于Mono跨平台的优缺点
    无限跨平台,维护工作量大,低版本的Mono无法支持新版C#新功能

Unity和Mono的关系

我们上节课了解了.Net的相关知识

我们先回顾一下其中的两个关键点:

  • Mono是基于.Net的跨平台方案,同时它具备.Net平台的跨语言特点
  • Mono的第一个版本是在2004年发布的

Unity公司于2004年成立
Unity的底层是通过C/C++来完成的
但是为了更方便的让开发者使用,Mono在当时成为了不二之选,因为它同时具备跨平台和跨语言的两个特性

总结:
Unity希望能有更多的开发者使用其进行游戏开发并且一次开发一劳永逸,所以跨语言和跨平台对于他们来说是很重要
虽然C++本身跨平台,但是如果使用C++作为上层逻辑开发语言,那么作为开发者来说选择性相对较少,并且对于初学者来说学习难度也较大
所以当时的Mono是非常满足Unity需求的,不仅支持跨语言还支持跨平台

Unity跨平台的必备概念

Unity主要包括两个部分:

  • Unity Engine(引擎):
    提供 UnityEngine.dll 动态库,各平台不同,C/C++编写,包含平台相关代码、 图形API、物理引擎、灯光等等所有游戏引擎底层内容
  • Unity Editor(编辑器):
    提供 UnityEditor.dll 动态库,大部分由C#编写,用户脚本最初可以使用C#、 JavaScript、Boo语言编写,项目代码最后由Mono编译
    (目前的用户脚本只能用C#编写了)

回顾 Mono 跨平台基本原理

Mono主要构成部分:

  1. C#编译器(mcs)
  2. Mono Runtime
    类似CLR公共语言运行时(虚拟机):包括 JIT(Just in time)即时编译器、AOT(Ahead of time)提前编译器、GC、类库加载器等等
  3. BCL基础类库
  4. Mono类库
    提供很多超出 .NET 的一些额外功能,主要用于构建各种操作系统上的应用

Unity跨平台的基本原理(Mono)

在Unity下使用各种语言进行逻辑实现
这些语言在发布时会被编译成 IL中间代码
最终这些中间代码在对应操作系统上
通过Mono VM(虚拟机)
真正翻译成机器码运行起来

image

image

基于Mono跨平台的优缺点

  • 优点:

    只要在不同操作系统上实现Mono VM(虚拟机)
    那我们能够支持的平台就会“无限”多

  • 缺点:

    维护工作耗时耗力,当Unity版本更新时,Mono VM也需要维护和更新
    那多对于N多个平台来说,工作量是非常大的(对于Unity的工作量)
    低版本Mono无法支持新版本C#的强大新特性

补充:什么是JIT

JIT(Just-In-Time)就是即时编译,是指在程序运行时将字节码动态地编译成本地机器码的过程。
JIT编译器会根据程序的实际运行情况,对频繁执行的热点代码进行优化编译,以提高其执行速度。
JIT编译器根据程序的执行统计信息和运行时环境,对代码进行动态优化,以生成高效的机器码。

在 .NET Core 和 Mono 中,JIT 编译器是CLR的一部分,
它将中间语言(IL)代码在运行时编译成机器码(Native Code)。JIT 编译器只在代码即将执行时才进行编译。