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的区别相关推荐

  1. Unity Mono和IL2CPP的区别

    *目录 Unity是如何实现跨平台的? Mono介绍 IL2CPP介绍 Mono与IL2CPP的区别* 一.Unity是如何实现跨平台的? 跨平台:一次编译,不需要任何代码修改,应用程序就可以运行在任 ...

  2. Unity3D中Enabled、Destroy与Active的区别

    Unity3D游戏对象消失三种方法的区别: 1.gameObject.active:是否在场景中停用该物体,在你gameObject.active =false中,则你在场景中用find找不到该物体. ...

  3. Mono和IL2CPP

    原文 https://zhuanlan.zhihu.com/p/352463394 增加了少部分自己的理解 什么是跨平台 首先,什么是跨平台? 跨平台:一次编译,不需要任何代码修改,应用程序就可以运行 ...

  4. Unity 中的 .NET、Mono 和 IL2CPP

    接 上一篇 继续了解,重点是 IL2CPP. 一.Unity 的脚本后端 Unity 使用开源 .NET 平台,以确保使用 Unity 创建的应用程序可以跨平台运行. 脚本后端(scripting b ...

  5. 工具设置Unity3D系列教程--使用免费工具在Unity3D中开发2D游戏 第一节

    时间紧张,先记一笔,后续优化与完善. 声明:   本博客文章翻译类别的均为个人翻译,版权全部.转载请注明出处: http://blog.csdn.net/ml3947,另外本人的个人博客:http:/ ...

  6. 如何将unity3d动画嵌入html,在Unity3D中使用精灵动画引擎制作动画的两种方法

    7月28日消息,如今的游戏玩家对于游戏角色的动作要求越来越高,给开发者提出了众多的要求,工作量也相应上升.那么如何才能简单快速地制作角色动画以提升效率呢?下面就和大家分享两个在Unity3D中使用精灵 ...

  7. Unity3d中UGUI组件精简复盘(十八)Aspect Ratio Fitter组件

    上一节,我们简单概括了Unity3D编辑器中三大 Layout Group组件的简要介绍.具体详情链接为:Unity3d中UGUI组件精简复盘(十七)LayoutElement 话不多说,我们直接进入 ...

  8. Unity3D中的动态字体和静态字体

    Unity3D中支持动态字体和静态字体两种格式字体,动态字体即使用TTF格式字体库,静态字体则需要自己打包字体图集.动态字体和静态字体区别在于,动态字体如果出现字体库中不存在的字体,会使用系统字体,而 ...

  9. 3Dmax已经贴好图的文件如何导入unity3D中

    3Dmax已经贴好图的文件如何导入unity3D中,对于初学者而言,有时候在3Dmax中贴好图,配好颜色的模型导入unity3D中会丢失贴图的问题. 解决方法: 1.在3Dmax中建好模型.贴图完成. ...

最新文章

  1. 后备干部,究竟应该提拔什么样的员工?
  2. Http权威指南学习研究
  3. php的exportexcel,PHPExcel export网络或本地图片到excel
  4. PL/SQL Developer使用技巧总结
  5. python整数逆序输出_利用Python实现倒序任意整数
  6. 面试官问我:解释一下Dubbo服务暴露
  7. 【数学基础】最小二乘法
  8. python 做界面时如何使图片保持透明背景_Python matplotlib生成图片背景透明的示例代码...
  9. 《机电传动控制》第三次作业
  10. Idea格式化mybatis框架mapper文件
  11. 这一刻我學會了堅強、給我一雙翅膀,我会向天空去翱翔。
  12. 针对python代码下载youtub视屏报错修复
  13. Excel表格按行数拆分为多个文件
  14. 用数字万用表精确测量小电阻
  15. UG NX 12 同步建模技术
  16. 关于调整互联网、电话订票起售时间的公告
  17. input输入框中嵌入下拉选项
  18. XSS学习笔记(未完)
  19. c语言程序设计数字电位器,X9C103数字电位器中文.pdf
  20. Java实现简单的递归操作

热门文章

  1. 用R获取芯片探针与基因的对应关系三部曲-bioconductor
  2. MongoDB高级教程
  3. 自旋锁、乐观锁、悲观锁、重入锁、公平锁
  4. 计算机软件与微电子专业,系专业和年级_ 计算机软件及微电子专业98级.doc
  5. 资讯汇总230217
  6. JavaSE高级【吐血整理汇总】
  7. 一个程序员上海买房,遇到的黑天鹅事件
  8. 你知道小黑鱼APP是干嘛的吗?
  9. Oracle的启动与停止(三个启动阶段和四种停库模式)
  10. 第一代社交机器人已死:商业模式错误还是生不逢时?