Unity脚本系统学习(一):Mono搭建的脚本核心
(本系列参照书籍:Unity3D脚本编程:使用c#语言开发跨平台游戏,为个人总结复习用)
(官方文档:https://docs.unity.cn/cn/current/Manual/overview-of-dot-net-in-unity.html)
问题:
1.Mono究竟是什么
2.Mono和Unity3D的关系
一.Mono是什么
1.Mono是.Net框架的另一种实现,是基于通用语言架构(Common Language Infrastructure,简写为CLI)和c#的ECMA标准(Ecma-334、Ecma-335)
(注:CLM和ECMA的概念:https://www.ecma-international.org/publications-and-standards/standards/ecma-335/ 简单来说就是
这个通用语言框架帮助了高级语言能够适应不同的开发环境,同时不用写特定环境的特定API,是一个虚拟机)
2.Mono的组成:
1.C#编译器:mcs 作用:将C#编译为ECMA CIL的字节码,然后调用MonoRunTime中的编译器,将CIL中的字节码再次进行编译,编译为原生码
(字节码:是一种包含执行程序,由一序列 op 代码(操作码)/数据对组成的二进制文件,是一种中间码。(举例:00 01 23 30))
(原生码:已被编译为指定CPU和指定指令集的机器码的代码)
2.MonoRunTime,实现ECMA和CIL,提供了一个即时编译器--JIT,提前编译器——AOT,类库加载器、垃圾回收器和线程系统等;
(详细有关MonoRunTime:https://www.mono-project.com/docs/advanced/runtime/)
(JIT)程序运行时编译
(AOT)在程序运行之前,将.exe或dll文件中的CIL字节码进行编译并存储(注意:由一部分CIL的字节码会在程序中进行编译)
(完全静态编译:Full-AOT)在程序运行之前就将所有CIL字节码进行编译(多数运用在IOS平台)
(垃圾回收器GC)分代收集和贝母垃圾收集器
3.基础类库和Mono类库
二.Mono如何扮演脚本的角色
游戏开发者通常需要平衡高效率的低级语言和低效率的高级语言之间抉择(低级语言直接和硬件打交道运行速度快,高级语言并不),脚本系统的诞生可以融合这两中语言的优点,使得底层和业务逻辑能够分开,一个用低级语言(C/C++),一个用高级语言(C#,JavaScript)
(根据速度衡量 C/C++是低级(静态不安全语言),C#是高级(静态安全性语言))
而Mono的嵌入就是建立这样一个虚拟环境,能让C#和低级语言交互从而提高运行速率
如何嵌入:

1.编译C++程序并链接MonoRunTime
2.初始化MonoRunTime
3.C/C++和C#/CIL的交互
三、详解CIL为何能跨平台
1.CIL本身是一个指令集,基于堆栈进行基础的操作(压入和弹出),同时还是面向对象的
2.以.Net或Mono等实现CLI标准的运行环境为目标的语言要先编译成CIL,然后CIL会被编译,并且以位源码的形式存在(源语言->中间语言)
3.这种位元码运行在虚拟机中,之后再进一步编译成不同平台的原生代码(中间语言->原生代码)

浙公网安备 33010602011771号