Mono和IL2Cpp

一.导入

  Unity的脚本资源是以dll文件的方式存在于磁盘上,在Unity中进行打包时,有两种打包方式选择:Mono和IL2CPP:

二.Mono和IL2CPP

  1.指令集位数:Mono只支持打包为32位指令集(使用32位指令集的计算机内存最大只有4G);IL2CPP支持64位(兼容32位)。

  2.打包后文件区别:Mono打包后文件中存在大量动态链接库文件(.dll后缀文件),也包括mono虚拟机文件(libmonobdwgc-2.0.so和libMonoPosixHelper.so),在运行程序时dll文件会加载到mono虚拟机中;IL2CPP打包后没有了dll文件,Unity主工程的dll文件(Assembly-CSharp.dll)和Mono虚拟机文件集成为IL2CPP虚拟机文件(libil2cpp.so)。

  3.脚本编译流程:

    1)Mono方式:在Unity编译打包时,使用C#书写的脚本会经过Mono的C#编译器打包为中间语言IL(Intermediate Language,IL语言所在的文件就是.dll后缀的文件),然后和其他dll文件一起在Mono虚拟机(Mono VM,Mono Virtual Machine)中运行。中间语言IL的存在主要是为了平台的兼容性,因为不同指令集平台执行同样的程序的具体机器语言并不是相同的,如果打包时直接将程序翻译为机器语言,那么打包后的程序包就只能在指定平台上运行,所以我们在打包时先将程序编译为中间语言IL,在不同的平台上使用Mono虚拟机将IL相应地翻译为该平台的机器语言执行。

    2)CLR:Common Language Runtime,公共语言运行时;CLI:Common Language Infrastructure,公共语言基础结构;CIL:Comoon Intermediate Language,公共中间语言;CLI = CLR + CIL;Mono:基于CLR的开源项目,允许引擎和用户的托管代码运行在每一个目标平台上。

    3)Mono虚拟机运行CIL的3种方式:

      JIT:Just In Time,在编译时将C#编译为CIL,在运行时逐条读入逐条翻译为原生码交给CPU执行;

      AOT:Ahead Of Time:在编译为CIL后,先将CIL预先编译为原生码,运行时直接交给CPU执行。AOT模式一般只处理部分CIL,剩余部分采用JIT模式运行;

      Full AOT:使用AOT模式处理所有CIL。

    4)IL2CPP方式:在Unity编译打包时,IL2CPP模式同样先将工程中的文件编译为IL,但是IL2CPP不会直接在虚拟机中运行这些IL,而是将工程IL和其他IL一起使用IL2CPP将这些IL变回CPP(C Plus Plus或C++)代码,然后再将C++代码放到本地编译器(具体运行的机器平台的编译器)上编译为能执行的原生汇编代码,再使用IL2CPP VM运行。

    5)IL2CPP的编译方式:只支持AOT方式

    6)平台支持:Android平台支持Mono和IL2CPP的所有编译方式,而IOS只支持Mono的Full AOT模式和IL2CPP 。

posted @   movin2333  阅读(842)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示