Unity3D脚本编程读书笔记——第2章 Mono脚本核心基础

应用的引擎由富有经验的开发人员使用C/C++开发,而一些具体项目中功能的实现则使用高级语言开发。

文章目录

  • 前言
    • 1. Mono是什么
    • 2. Mono和脚本
    • 3. 跨平台和CIL
    • 4. C#和UnityScript
  • 总结


前言

本篇是针对《Unity3D脚本编程——使用C#语言开发跨平台游戏》一书 第2章节《Mono所搭建的脚本核心基础》 的读书笔记,记录了其中一些基础知识、核心要点以及一些有趣的信息。
本章节的核心内容在于剖析Unity3D的脚本基础所依赖的.NET环境,即Mono运行时,介绍其是为什么,以及在Unity3D脚本编程中扮演什么样的角色。本章节并没有涉及到编写脚本程序的内容,更多的,是介绍脚本引擎的特性。


1. Mono是什么

Mono是Xararin公司所赞助的开源项目,是微软.NET框架的另一种实现(是.NET框架在不同平台上的补充),同时它具备了跨平台的能力。

  • Mono 1.0(2004) Linux桌面应用程序开发者平台

Mono的组件:

  • C#编译器 mcs
  • Mono运行时 提供一个即时编译器(Just-in-time,JIT),一个提前编译器(Ahead-of-time,AOT),还有类库加载器、垃圾回收器(运行时会追踪目标对象,并且自行决定是否回收对象的内存)和线程系统等
  • 基础类库 同时兼容微软的.NET框架
  • Mono类库

其中,C#编译器mcs将C#编译为CIL的字节码(byte code),然后Mono运行时中的编译器将CIL的字节码转译为原生码(native code),共有3种转译方式:

  • 即时编译(JIT) 在程序运行过程中将CIL的字节码转译为目标平台的原生码
  • 提前编译(AOT) 在程序运行之前将执行程序或动态链接库的CIL字节码转译为目标平台的原生码并存储起来(仍会有需要用JIT转译的部分)
  • 完全静态编译(Full-ahead-of-time,Full-AOT) 在程序运行之前所有的代码就已经编译成目标平台的原生码(如针对iOS平台)

2. Mono和脚本

语言从低级到高级的大概排名:

  • 汇编
  • C/C++ 编译型静态不安全语言
  • C#,Java 编译型静态安全语言
  • Python、Perl、JavaScript 解释型动态安全语言

Mono运行时嵌入到应用后,得到一个完整的虚拟机运行环境。

托管代码 通过CIL编译器生成的CIL代码

总结来说,Mono运行时去支撑脚本架构的基础主要体现在两点上:在C#中调用C++中的方法,以及在C++中调用C#中实现的方法。如此,脚本层面可以调用引擎底层提供的方法,而引擎可以通过句柄的方式解读脚本代码。

3. 跨平台和CIL

跨平台的核心原理——中间层过渡转换,对应到Unity3D,就是CIL代码指令集。

CIL的特性 可以运行在所有支持CLI(Common Language Infrastructure,通用语言基础结构)的环境中,从而实现了平台无关(或CPU无关)

源代码——中间语言——虚拟机——原生代码

4. C#和UnityScript

脚本语言的选择,本质上是对脚本编译器(可以把相应脚本编译为CIL)的选择。

C#和UnityScript是存在效率差异的,其根源主要在于二者经过编译器生成的CIL中间语言并不是完全一致的,主要是一些语言细节上的处理的差异,进而会导致一些影响效率的操作(如装箱拆箱等)。


总结

本章着力于阐述Mono运行时以及其在串联低级语言和高级语言时的作用,涉及到的内容艰深晦涩,但好在其中的过程相对比较清晰,需要始终抓住一个核心原理:CIL的多平台支持性。CIL就好像一个转接头,我们需要想办法把代码流进去,而它自然会为你转接到各种各样的设备。

你可能感兴趣的:(Unity,unity,3d,游戏引擎)