首先来说说Mono,Mono是 Xamarin公司开发的跨平台 .NET运行环境,是.NET框架的另一种实现。区别在于,它可以跨平台。(Unity的跨平台特性依赖于Mono)
再来看看 Mono的组成 。
1.C#编译器。
最新的Momo版本(5.0+)c#编译器完全兼容c#4.0以上,我使用的是Unity3D,2017.3.1f1版本,它使用的是Mono2.0+版本,它的编译器(mcs)就不支持c#4.0以上。
2.Mono运行时
提供了JIT(即时编译器),AOT(提前编译器)两种编译器。
还有三种编译方式:JIT,AOT,Full-AOT(完全杜绝了JIT编译,主要是用于ios平台。)
还提供了类库加载器。
垃圾回收器:(之前说到,unity2017版本使用的是早期的Mono版本,所以使用的垃圾回收机制是贝姆垃圾回收,另一种机制(Mono2.8之后)是分代垃圾回收。所以与.net框架相比,性能要差不少。在网上看到消息说Unity2018会放弃Mono,转投.Net Core,很大原因就是因为这个。)
3.基础类库(与.net框架兼容)+Mono类库
再来看看 Mono提供的脚本机制 。
Unity3D引擎是用C++编写的。而我们写的游戏脚本大多是用C#编写的。这是怎么实现的呢?
简单点说,就是将Mono运行时嵌入到了U3D中,然后使用mcs将脚本编译成CIL(通用中间语言)。
在U3D地址空间中,是这样的情况:
托管代码和非托管代码进行交互。(交互的实现,最常见的做法是提供句柄供脚本语言使用,具体怎么实现交互的就不赘述了。)
最后看看 Unity3D为何能跨平台 。
首先说说CIL( 通用中间语言 ),CIL能在所有支持CLI(通用语言基础结构)的环境中运行,Mono运行时就是,就是说CIL的运行,与具体的平台和CPU架构无关。
CIL是基于堆栈的,意味着数据是通过堆栈来操作的,而非通过CPU寄存器来操作。
CIL是面向对象的。
所以跨平台需要两步:
第一步,将代码编译成CIL(以位元码形式存在)。
第二步,在mono运行时中使用编译器将CIL编译成本地原生代码。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- APUE 学习笔记——进程关系
- MyBatis学习笔记(2)—映射关系篇
- elasticsearch学习笔记(二十)——Elasticsearch bulk api的奇特json格式与底层性能优化关系
- 框架与RTTI的关系,RTTI与反射之间的关系
- 如何用循环关系网络机智地解决数独类关系推理任务?
- 【mybatis xml】数据层框架应用--Mybatis(三)关系映射之一对一关系映射
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
断点:互联网进化启示录
[美]杰夫·斯蒂贝尔 / 师蓉 / 中国人民大学出版社有限公司 / 2014-11-1 / CNY 49.00
一部神经学、生物学与互联网技术大融合的互联网进化史诗巨著。 我们正置身网络革命中。互联网的每一丝变化都与你我息息相关。当科技变得无处不在时,它就会改变你我。在《断点》一书中,大脑科学家和企业家杰夫·斯蒂贝尔将带领读者来到大脑、生物与技术的交汇处,向读者展示生物学和神经学是如何与互联网技术发生联系的;我们是如何通过生物学上的前车之鉴,来预测互联网的发展的;互联网在经历增长、断点和平衡后又会发生......一起来看看 《断点:互联网进化启示录》 这本书的介绍吧!