很多开发者只知道Unity引擎有个什么Mono平台,但很少人会真正了解Mono到底是个什么东西,而它与Unity引擎之间的关系又是什么样的。另外,Unity引擎的内存又是怎么划分的呢?

Mono平台 是一个开源项目,是基于API、规范和.Net Framework的工具构建了自己的类库平台。介绍特点
(1)跨平台性:它的作用是通过框架提供跨平台开发:允许多种可以编译为.NET的通用中间语言(CIL)的通用编程语言(如:C#、Java、VB.NET、UnityScript等)编写的代码运行在很多不同的硬件平台(如 Linux、Mac OS、Window、ARM、PowerPC等)上。
(2)只是Unity引擎的“一部分”,不能说Unity引擎构建在Mono平台上。因为Unity引擎和其他游戏引擎一样:像处理渲染、动画和资源管理这样重要模块大都是C++编写运行的。而Mono说白了就是为我们开发者能使用高级编程语言编写玩法逻辑,控制该游戏引擎的“脚本编写界面”。
(3)托管语言:是指必须运行在公共语言运行时(CLR)的源码。这种语言特点如下:
a.垃圾自动回收,有自己的内存管理机制,提供各种安全管理内存特性。但是以牺牲运行时的开销为代价;
b.简化了编程行为,开发高效,也让不懂C++的开发人员也可以实现游戏逻辑;

内存域:Unity游戏引擎内存空间主要划分为托管域、本地域、外部库。
(1)托管域:这是Mono平台工作的地方,编写MonoBehaviour和自定义的C#代码在运行时都会在此域实例化对象。而且内存空间自动被垃圾回收管理。
(2)本地域:为像各种Unity子系统(渲染管线、物理系统、用户输入系统)等分配资源数据(纹理、音频和网格等)和内存空间。而且包含了GameObject和Component等重要游戏对象的部分本地描述,以便和这些内部系统交互。这也是大多数内奸Unity类(例如Transform和Rigidbody组件)保存数据的地方。
桥接:托管域也包含存储在本地域中的对象描述的包装器。因此,当和Transform等组件交互时,大多数指令会请求Unity进入它的本地代码,在那里生成结果,接着将结果复制回托管域。当2个域对相同实体有自己的描述时,跨越它们之间的桥需要内存进行上下文切换,而这会为游戏带来很严重的性能问题。因此尽可能地最小化此行为。
(3)外部库:像DirectX和OpenGL库,也包含自定义的库和插件。在C#代码中引用这些类库将导致类似的内存上下文切换和后续成本。

从现代操作系统运行内存空间可以划分为:栈和堆。
:是内存中预留的特殊空间,专门用于存储小的、短期的数据值,这些值一旦超出作用域就会自动释放,因此成为栈。顾名思义,它就像栈数据结构一样,从顶部压入与弹出数据。栈已经包含了已经声明的任何本地变量,并在调用函数时处理它们的加载与卸载。这些函数调用通过所谓的调用栈进行拓展与收缩。当对当前函数完成调用栈的处理时,它跳回调用栈中之前的调用点,并从之前离开的位置继续执行剩余内容。并从之前离开的位置继续执行剩余内容。之前内存分配的开始位置总是已经知道的,没必要执行内存清理操作,因为新的内存分配只会覆盖旧的数据,因此,栈相对快速、高效。
:所有其他的内存空间,并用于大多数内存分配,由于我们想让大多数内存分配的持有时间比当前函数调用更长,因此不能在栈中分配它们,因为它们会在当前函数调用时覆盖。因此,当数据类型太大以至于在栈中放不下,或者必须保存在声明的函数外时,可以在堆上分配它。

总结:本篇主要介绍了Unity引擎的Mono平台定义以及它与Unity引擎的关系。另外是Unity引擎对内存区域地划分,以及从操作系统角度而言关于内存空间的划分。它们的本质是一样的:都是包含在RAM中数据字节。操作系统会请求保存这些数据字节。不同之处在于使用它们的时机、场合以及方式。