unity3d中ScriptingBackend选择mono和il2cpp的区别
unity3d中ScriptingBackend选择mono和il2cpp的区别
在iOS和Android上,在Player Settings中选择mono或il2cpp脚本后端。要更改脚本后端,请转到“Player Settings 窗口(菜单:Edit > Project Settings > Player),向下滚动到“Other Settings”部分,然后从“Scripting Backend”下拉菜单中选择mono或il2cpp。
注意:从2017.3开始,选择IL2CPP脚本后端或Mono脚本后端。然而,webgl和uwp都只支持il2cpp。iOS仍然支持快速迭代的Mono脚本后端,但您不能再向Apple提交Mono(32位)应用程序。
如果都没有被加密,用 mono 打包的 unity 游戏可以用 assembly-csharp.dll 文件反编译看到源代码。用 il2cpp 打包的 unity 游戏却只能用 il2cppdump 运行 libil2cpp.so 和 global-metadata.dat 来模拟取得 dll,但是这个 dll 只有函数名和偏移地址
MONO的好处:
1、久经考验
2、出包速度快
3、包体略小
4、支持安卓上dll动态载入程序集热更新(本人没有用过,不肯定IL2CPP完全不支持)
IL2CPP的好处:
1、没有堆内存只涨不降的问题(据说某些大厂内部有质量验收标准,这一条会有很大优势)
2、C#侧的计算密集型算法性能暴增N倍(我们项目的同地图寻路、自动建筑位置规划等算法的速度都有3倍以上提升)
3、lua热更无任何问题,反射调用还是导出式调用都很完美支持(应该不能算优点,但确实在我的预料之外)
说一下IL2CPP的问题吧:
1、构建时间长好多,安卓NDK的windows版工具链怎么就能性能这么低呢!(AMD 16核32线程撕裂者走起,NDK编译时完美支持并行化的,核多了编译慢也不是事儿了)
2、IL2CPP后,如果仅编译ARMv7的版本,部分模拟器无法启动游戏。用FAT(ARMv7 + x86)就可以了,而且模拟器上运行也非常流畅了,当然包又大了20多MB(我们的c#代码就是这么多…)
首先理解一下静态语言与动态语言的区别:
1.静态类型语言是指在编译时变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量之前必须声明数据类型.例如c++
2.动态类型语言是在运行时确定数据类型的语言。变量使用之前不需要类型声明,通常变量的类型是被赋值的那个值的类型。 例如:c#
接下来说一下unity3d 中mono:
简单理解一下mono其实是一个项目框架和工具,里边包含了c#的编译器和通用语言框架。
说起来mono那不得不说c#,c#是微软推出的一种基于.NET框架的、面向对象的高级编程语言,它与java相比最大的不足是跨平台,因为在没有mono之前c#只能在window下运行.
因为有了mono这个框架所以c#才可以具有这么好的跨平台的功能,当然这是mono vm 也就是mono虚拟机是il2cpp vm之前的版本。
IL
啰嗦完了C#,.Net Framework和Mono,引出了我们很重要的一个概念”IL“。IL的全称是 Intermediate Language,很多时候还会看到CIL(Common Intermediate Language,特指在.Net平台下的IL标准)。在Unity博客和本文中,IL和CIL表示的是同一个东西:翻译过来就是中间语言。它是一种属于通用语言架构和.NET框架的低阶(lowest-level)的人类可读的编程语言。目标为.NET框架的语言被编译成CIL,然后汇编成字节码。CIL类似一个面向对象的汇编语言,并且它是完全基于堆栈的,它运行在虚拟机上(.Net Framework, Mono VM)的语言。
具体过程是:C#或者VB这样遵循CLI规范的高级语言,被先被各自的编译器编译成中间语言:IL(CIL),等到需要真正执行的时候,这些IL会被加载到运行时库,也就是VM中,由VM动态的编译成汇编代码(JIT)然后在执行。
正是由于引入了VM,才使得很多动态代码特性得以实现。通过VM我们甚至可以由代码在运行时生成新代码并执行。这个是静态编译语言所无法做到的。回到上一节我说的Boo和Unity Script,有了IL和VM的概念我们就不难发现,这两者并没有对应的VM虚拟机,Unity中VM只有一个:Mono VM,也就是说Boo和Unity Script是被各自的编译器编译成遵循CLI规范的IL,然后再由Mono VM解释执行的。这也是Unity Script和JavaScript的根本区别。JavaScript是最终在浏览器的JS解析器中运行的(例如大名鼎鼎的Google Chrome V8引擎),而Unity Script是在Mono VM中运行的。本质上说,到了IL这一层级,它是由哪门高级语言创建的也不是那么重要了,你可以用C#,VB,Boo,Unity Script甚至C++,只要有相应的编译器能够将其编译成IL都行!
IL2CPP, IL2CPP VM
本文的主角终于出来了:IL2CPP。有了上面的知识,大家很容易就理解其意义了:把IL中间语言转换成CPP文件。大家如果看明白了上面动态语言的CLI, IL以及VM,再看到IL2CPP一定心中充满了疑惑。现在的大趋势都是把语言加上动态特性,哪怕是c++这样的静态语言,也出现了适合IL的c++编译器,为啥Unity要反其道而行之,把IL再弄回静态的CPP呢?这不是吃饱了撑着嘛。根据本文最前面给出的Unity官方博客所解释的,原因有以下几个:
1.Mono VM在各个平台移植,维护非常耗时,有时甚至不可能完成
Mono的跨平台是通过Mono VM实现的,有几个平台,就要实现几个VM,像Unity这样支持多平台的引擎,Mono官方的VM肯定是不能满足需求的。所以针对不同的新平台,Unity的项目组就要把VM给移植一遍,同时解决VM里面发现的bug。这非常耗时耗力。这些能移植的平台还好说,还有比如WebGL这样基于浏览器的平台。要让WebGL支持Mono的VM几乎是不可能的。
2.Mono版本授权受限
大家有没有意识到Mono的版本已经更新到3.X了,但是在Unity中,C#的运行时版本一直停留在2.8,这也是Unity社区开发者抱怨的最多一条:很多C#的新特性无法使用。这是因为Mono 授权受限,导致Unity无法升级Mono。如果换做是IL2CPP,IL2CPP VM这套完全自己开发的组件,就解决了这个问题。
3.提高运行效率
根据官方的实验数据,换成IL2CPP以后,程序的运行效率有了1.5-2.0倍的提升。
使用Mono的时候,脚本的编译运行如下图所示:
简单的来说,3大脚本被编译成IL,在游戏运行的时候,IL和项目里其他第三方兼容的DLL一起,放入Mono VM虚拟机,由虚拟机解析成机器码,并且执行
IL2CPP做的改变由下图红色部分标明:
在得到中间语言IL后,使用IL2CPP将他们重新变回C++代码,然后再由各个平台的C++编译器直接编译成能执行的原生汇编代码。
总结一下:
1.将il变成cpp的首要原因除了是cpp在各大平台的可移植性高之外还有cpp在各个平台编译时会做相应的代码优化,提高运行效率
2.为什么由il编译成cpp后还需要il2cpp vm的存在呢,是因为动态语言里转换成静态语言时仍然有内存回收问题的存在,需要靠动态语言的gc去解决,还有线程的创建工作,所以il2cpp vm只包含了一小部分工作,相比mono vm剔除了不必要的IL加载和动态解析的工作,使得IL2CPP VM可以做的很小,并且使得游戏载入时间缩短。
3.其实是ios不支持动态语言的编译,所以只能使用AOT(Ahead Of Time)编译而非JIT(Just In Time)编译
unity3d中ScriptingBackend选择mono和il2cpp的区别相关推荐
- Unity Mono和IL2CPP的区别
*目录 Unity是如何实现跨平台的? Mono介绍 IL2CPP介绍 Mono与IL2CPP的区别* 一.Unity是如何实现跨平台的? 跨平台:一次编译,不需要任何代码修改,应用程序就可以运行在任 ...
- Unity3D中Enabled、Destroy与Active的区别
Unity3D游戏对象消失三种方法的区别: 1.gameObject.active:是否在场景中停用该物体,在你gameObject.active =false中,则你在场景中用find找不到该物体. ...
- Mono和IL2CPP
原文 https://zhuanlan.zhihu.com/p/352463394 增加了少部分自己的理解 什么是跨平台 首先,什么是跨平台? 跨平台:一次编译,不需要任何代码修改,应用程序就可以运行 ...
- Unity 中的 .NET、Mono 和 IL2CPP
接 上一篇 继续了解,重点是 IL2CPP. 一.Unity 的脚本后端 Unity 使用开源 .NET 平台,以确保使用 Unity 创建的应用程序可以跨平台运行. 脚本后端(scripting b ...
- 工具设置Unity3D系列教程--使用免费工具在Unity3D中开发2D游戏 第一节
时间紧张,先记一笔,后续优化与完善. 声明: 本博客文章翻译类别的均为个人翻译,版权全部.转载请注明出处: http://blog.csdn.net/ml3947,另外本人的个人博客:http:/ ...
- 如何将unity3d动画嵌入html,在Unity3D中使用精灵动画引擎制作动画的两种方法
7月28日消息,如今的游戏玩家对于游戏角色的动作要求越来越高,给开发者提出了众多的要求,工作量也相应上升.那么如何才能简单快速地制作角色动画以提升效率呢?下面就和大家分享两个在Unity3D中使用精灵 ...
- Unity3d中UGUI组件精简复盘(十八)Aspect Ratio Fitter组件
上一节,我们简单概括了Unity3D编辑器中三大 Layout Group组件的简要介绍.具体详情链接为:Unity3d中UGUI组件精简复盘(十七)LayoutElement 话不多说,我们直接进入 ...
- Unity3D中的动态字体和静态字体
Unity3D中支持动态字体和静态字体两种格式字体,动态字体即使用TTF格式字体库,静态字体则需要自己打包字体图集.动态字体和静态字体区别在于,动态字体如果出现字体库中不存在的字体,会使用系统字体,而 ...
- 3Dmax已经贴好图的文件如何导入unity3D中
3Dmax已经贴好图的文件如何导入unity3D中,对于初学者而言,有时候在3Dmax中贴好图,配好颜色的模型导入unity3D中会丢失贴图的问题. 解决方法: 1.在3Dmax中建好模型.贴图完成. ...
最新文章
- 后备干部,究竟应该提拔什么样的员工?
- Http权威指南学习研究
- php的exportexcel,PHPExcel export网络或本地图片到excel
- PL/SQL Developer使用技巧总结
- python整数逆序输出_利用Python实现倒序任意整数
- 面试官问我:解释一下Dubbo服务暴露
- 【数学基础】最小二乘法
- python 做界面时如何使图片保持透明背景_Python matplotlib生成图片背景透明的示例代码...
- 《机电传动控制》第三次作业
- Idea格式化mybatis框架mapper文件
- 这一刻我學會了堅強、給我一雙翅膀,我会向天空去翱翔。
- 针对python代码下载youtub视屏报错修复
- Excel表格按行数拆分为多个文件
- 用数字万用表精确测量小电阻
- UG NX 12 同步建模技术
- 关于调整互联网、电话订票起售时间的公告
- input输入框中嵌入下拉选项
- XSS学习笔记(未完)
- c语言程序设计数字电位器,X9C103数字电位器中文.pdf
- Java实现简单的递归操作