目录
一:Mono和IL2CPP介绍
二:两种模式打包测试
三:编译流程
1.Mono编译流程
2.Mono工作原理:
3.Mono编译阶段:编辑
4.执行阶段:
5.IL2CPP做的改变由下图红色部分标明:
四:平台支持
在从业过程中有很多初学者一开始只知道打包流程,但是期间的一些固定设置具体是什么意思我们大部分都是知其然不知其所以然的,包括从业多年的本人在内因为没有底层编码的基础所以很多功能我们都只是拿来用,但是当你使用的多的时候你就会去考虑为什么要这样做,然后就是查找相关的资料学习总结,即便不能完全明白理解,但是最起码解惑不少。希望大家在从业过程中始终保持一颗求知探索的心。
一:Mono和IL2CPP介绍参考:Unity将来时:IL2CPP是什么? - 知乎,3. IL2CPP & Mono - 简书,https://www.bilibili.com/video/BV1Ra411c7Gz
Mono:mono是一款开源、免费、可定制的跨平台.NET运行环境。由于.net只能在windows,mono相当于是一个.net CLR的跨平台变种,就是为了解决跨平台的移植问题。可以理解为虚拟机。
IL2CPP:把IL中间语言转换成CPP文件
Unity设置: 在iOS和Android上,可以通过Player Settings里面选择Mono或者IL2CPP作为脚本后端。如果需要改变脚本后端,到Player Settings窗口(具体的菜单:Edit > Project Settings > Player), 向下滚动到Other Settings区域,然后从下拉菜单中选择Mono或者IL2CPP。 unity只有il2cpp模式的编译才支持64位系统,mono是不支持的。苹果在2016年1月就要求所有新上架游戏必须支持64位架构,所以必须要选il2cpp。从2019年8月1日起,在Google Play上发布app必须支持64位体系。在国内上架目前 32 64 都可以,WebGL和UWP只支持IL2CPP。
优缺点:
IL2CPP:和Mono相比,代码生成被大力改进,可以从C++代码中能够从上到下进行调试,可以开启Engine code stripping选项来减少代码大小,打包的过程要比Mono时间长,只支持预编译(Ahead of Time AOT),支持64位系统Mono:打包过程比IL2CPP快,因为即时编译(Just In Time compilation JIT)能够支持更多的托管代码库,支持运行过程中代码执行,必须搭载托管的程序集(通过mono- 或者 .net- 产生的.dll文件),只支持32位系统
二:两种模式打包测试Mono打包后的包体目录结构如下: 打空包时间耗时30s,包体大小17mb
IL打包后的包体目录结构如下: 打空包时间耗时两分钟,包体大小10mb
此处关联热更逻辑是重点
1.Mono编译流程简单的来说,3大脚本(目前主流为C#)被编译成IL,在游戏运行的时候,IL和项目里其他第三方兼容的DLL一起,放入Mono VM虚拟机,由虚拟机解析成机器码,并且执行
c#语言脚本—>Mono编译器(通过编辑器把c#变成一种中间汇编语言IL)—>结合其他第三方DLL—>放入MonoVM虚拟机(动态的编译成汇编代码JIT)—>执行

在得到中间语言IL后,使用IL2CPP将他们重新变回C++代码,然后再由各个平台的C++编译器直接编译成能执行的原生汇编代码。