Unity3D学习(一):简单梳理下Unity跨平台的机制原理
前言
首先需要了解的是,Unity3D的C#基础脚本模块是通过Mono来实现的。
什么是Mono?
参考下百度百科:Mono是一个由Novell公司(由Xamarin发起)主持的项目,并由Miguel de lcaza领导的,一个致力于开创.NET在Linux上使用的开源工程。它包含了一个C#语言的编译器,一个CLR的Runtime,和一组类库,并实现了 ADO NET和ASP NET。
它基于CIL和C#的ECMA标准,提供了了微软.Net FrameWork的另一种实现。
Mono主要有以下部分组成:
C#编译器——mcs。(最新的Mono版本已经可以支持C#5.0,但Unity3D的Mono版本仍然停留在2.0+阶段(支持c#3.0),所以C#的一些新功能无法在unity中使用)
运行时:即时编译器JIT(后文会介绍)。以及GC,类库加载器等等。
基础类库(BCL)。
Mono类库。提供了超出微软.NET的一些类,提供了许多额外功能,主要是用于构建其他操作系统上的应用。
下面进入正题:
Mono和Unity
Unity引擎本身是由C++写出的,只不过Mono被嵌入到了Unity当中,为unity提供了一个完整的虚拟机运行环境。这样Mono的嵌入接口会将Mono Runtime暴露给Unity底层的C++代码。通过这些接口,开发者就可以控制Mono Runtime,以及依托于Mono Runtime的托管代码。
Unity为何能够跨平台?
一句话概括,主要原因在于Unity通过Mono使用了一种叫CIL(Common Intermediate Language,也叫MSIL)通用中间语言的基于堆栈的代码指令集,它属于CLR的一个子集。
Unity3D的开发过程中,代码的编译主要分为两个过程:
1)首先将对应的脚本代码编译成CIL(之后CIL还会被编译成一种位元码,生成一个CLI集合)。
2)然后Mono在运行时将CLI集合中的位元码编译为本地运行的原生指令。(这里会使用到上文中的JIT、AOT编译模式)
注:也就是说在Mono中运行的其实是CIL,而在本地运行的是被编译后生成的原生指令。
这里再提一下什么是JIT和AOT
JIT:即时编译,或者又称为动态编译,是在程序执行时才编译代码,即将一条中间托管语句(CLI)翻译成一条机器语句,然后执行这条语句。但它同时也会将编译过的代码进行缓存,而不是每一次都进行编译。所以说它是静态编译和解释器的结合体。
AOT:静态编译,同样使用了JIT来进行编译,只不过它在程序运行之前就编译好了。但还是有一部分代码会即时编译。
AOT的过程简要:
1)收集需要编译的代码。
2)使用JIT编译代码。
3)发射编译过的代码和一些元数据
4)调用本地汇编器或连接器处理后生成可执行文件。
注:IOS平台禁止使用JIT编译器,所以Mono提供了一种FULL AOT模式,这里不赘述。
总结
Unity的跨平台,就是通过Mono将C#脚本代码编译成CLI,然后Mono运行时利用JIT或者AOT将CLI编译成目标平台的原生代码实现的。
参考资料
1.百度百科
https://baike.baidu.com/item/CIL/3583850?fr=aladdin
https://baike.baidu.com/item/JIT%E7%BC%96%E8%AF%91%E5%99%A8/3793585
2.电子工业出版社:《Unity3D脚本编程》 作者:陈嘉栋
Unity3D学习(一):简单梳理下Unity跨平台的机制原理的更多相关文章
- Spring5.0源码学习系列之浅谈懒加载机制原理
前言介绍 附录:Spring源码学习专栏 在上一章的学习中,我们对Bean的创建有了一个粗略的了解,接着本文挑一个比较重要的知识点Bean的懒加载进行学习 1.什么是懒加载? 懒加载(Lazy-ini ...
- 简单梳理下 Vue3 的新特性
在 Vue3 测试版刚刚发布的时候,我就学习了下 Composition API,但没想到正式版时隔一年多才出来,看了一下发现还是增加了不少新特性的,在这里我就将它们一一梳理一遍. 本文章只详细阐述 ...
- Unity3D学习(七):Unity多重采样抗锯齿设置无效的解决办法
前言 学习Shader的过程中发现模型锯齿严重,于是去Edit--Project Settings--Quality选项下将反锯齿设置为了8X Multi Sampling.结果没有任何改变,如图: ...
- Unity3D 学习 创建简单的按钮、相应事件
选择file -->new project 然后保存到相应的地方 下面是这个刚创建的工程效果图. 然后创建一个C# Script ||定位到最左下角找到 assets --> creat ...
- Unity3D学习笔记(四)Unity的网络基础(C#)
一 网络下载可以使用WWW类下载资源用法:以下载图片为例WWW date = new WWW("<url>");yield return date;texture = ...
- Unity3D学习笔记(三)Unity的C#基础
在C#脚本中,必须显式的继承MonoBehaviour类需要注意的是,在创建C#脚本时,脚本名应尽量符合C#命名规则,以字母或下划线开头,因为类名的默认跟随脚本名.C#声明变量的方式和C++和Java ...
- Unity3D学习笔记(二)Unity的JavaScript基础
Update()每帧调用一次LateUpdate()在Update()后执行Awake()系统执行的第一个方法Start()在Awake()之后,Update()之前FixedUpdate()固定更新 ...
- Unity3D学习笔记3——Unity Shader的初步使用
目录 1. 概述 2. 详论 2.1. 创建材质 2.2. 着色器 2.2.1. 名称 2.2.2. 属性 2.2.3. SubShader 2.2.3.1. 标签(Tags) 2.2.3.2. 渲染 ...
- Unity3D 学习笔记
不是什么技术文章,纯粹是我个人学习是遇到一些觉得需要注意的要点,当成笔记. 1.关于调试,在Android下无法断点,Debug也无法查看,查看日志方法可以启动adb的log功能,或者自己写个GUI控 ...
随机推荐
- java工具类(二)之java正则表达式表单验证
java正则表达式表单验证类工具类(验证邮箱.手机号码.qq号码等) 这篇文章主要介绍了java使用正则表达式进行表单验证工具类,可以验证邮箱.手机号码.qq号码等方法,需要的朋友可以参考下. jav ...
- daemontools安装和使用
daemontools安装和使用 参考: http://cr.yp.to/daemontools/install.html daemontools用于自动重启进程.当某个关键服务进程崩溃,可以利用da ...
- 【Android 应用开发】GitHub 优秀的 Android 开源项目
原文地址为http://www.trinea.cn/android/android-open-source-projects-view/,作者Trinea 主要介绍那些不错个性化的View,包括Lis ...
- cocos2d-x 游戏开发之有限状态机(FSM) (二)
cocos2d-x 游戏开发之有限状态机(FSM) (二) 1 状态模式
- 如何解决Asp.Net中不能上传压缩文件的问题
在使用Asp.Net自带的服务器端控件Fileupload上传文件时,可能会出现不能上传压缩文件的问题,此时可以通过下面的方法解决: 在<system.web>中添加: <httpR ...
- C语言之数值计算--级数算法
在编程语言的学习中,我们学习过不少的算法,比如累加,累乘,数值交换,排序等等.在一些软件比赛和面试题中,有一类算法不容忽视,属于高频题目,我之前去企业面试的时候就遇到这样的一类题目,题目不算难,掌握方 ...
- "《算法导论》之‘树’":AVL树
本文关于AVL树的介绍引自博文AVL树(二)之 C++的实现,与二叉查找树相同的部分则不作介绍直接引用:代码实现是在本文的基础上自己实现且继承自上一篇博文二叉查找树. 1.AVL树的介绍 AVL树是高 ...
- 【Qt编程】基于Qt的词典开发系列<四>--无边框窗口的缩放与拖动
在现在,绝大多数软件都向着简洁,时尚发展.就拿有道的单词本和我做的单词本来说,绝大多数用户肯定喜欢我所做的单词本(就单单界面,关于颜色搭配和布局问题,大家就不要在意了). 有道的单词本: 我所做的单词 ...
- coco2dx添加类报错
最近刚开始学习2dx,用的vs编辑器,现在说说我使用时碰到的一点小问题: 我使用的类添加向导,但是添加的类在win32目录下,而且编译的时候总是提示找不到 .h 文件 其实,这样添加类不是很好,可以在 ...
- css区分ie8/ie9/ie10/ie11 chrome firefox的代码
以下是几个主要浏览器的css hack汇总: 现有css样式为: .class{ color:red; } 判断IE8以上的浏览器才执行的代码/* IE8+ */ .class{ color:red ...