• 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 。

  • 相关阅读:
    POJ 数论入门
    2022初级会计实务
    Boot++:后端验证防止重复提交
    HashMap的原理,我懂了。(未完全版本)
    【NOI Online 2022】游记
    Python中的包管理工具pip的基本使用
    yarn包管理器
    setTimeout改写
    ubuntu安装指定版本nvidia驱动、CUDA、nvidiadocker
    CVPR'22 最新132篇论文分方向整理|包含目标检测、图像处理、医学影像等28个方向
  • 原文地址:https://www.cnblogs.com/porter/p/15770700.html
Copyright © 2020-2023  润新知