CS5L2——Unity跨平台的基本原理之Mono
CS5L2——Unity跨平台的基本原理之Mono
主要内容
- Unity和Mono的关系
利用Mono实现Unity上层逻辑的跨语言和跨平台 - Unity跨平台的必备概念
Unity底层是C/C++,上层逻辑支持多语言(目前只用C#)
Mono的基本构成有C#编译器、Mono运行时(虚拟机)、各种类库等 - Unity跨平台的基本原理(Mono)
将基于CLI公共语言基础规则的语言编译成CIL公共中间语言,再通过Mono VM(虚拟机) 将其在各操作系统中转译为原生机器码进行运行 - 基于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主要构成部分:
- C#编译器(mcs)
- Mono Runtime
类似CLR公共语言运行时(虚拟机):包括 JIT(Just in time)即时编译器、AOT(Ahead of time)提前编译器、GC、类库加载器等等 - BCL基础类库
- Mono类库
提供很多超出 .NET 的一些额外功能,主要用于构建各种操作系统上的应用
Unity跨平台的基本原理(Mono)
在Unity下使用各种语言进行逻辑实现
这些语言在发布时会被编译成 IL中间代码
最终这些中间代码在对应操作系统上
通过Mono VM(虚拟机)
真正翻译成机器码运行起来
基于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 编译器只在代码即将执行时才进行编译。