0
点赞
收藏
分享

微信扫一扫

Mono介绍-Unity为什么能跨平台,以及IOS为什么不能热更代码

全栈学习笔记 2022-04-19 阅读 19
unity

Mono

Mono是一个开源项目。基于通用语言架构和C#的 ECMA标准,提供了.NET的另一种实现。并且具备了跨平台的能力,能在Windws、Mac、Linux甚至一些游戏平台上运行。

查看unity的Mono版本

 Debug.Log(Application.unityVersion);
        Type type = Type.GetType("Mono.Runtime");
        if (type != null)
        {
            MethodInfo displayName = type.GetMethod("GetDisplayName", BindingFlags.NonPublic | BindingFlags.Static);
            if (displayName != null) Debug.Log(displayName.Invoke(null, null));
        }

Mono的组成

  1. C#编译器 mcs
    编译器的作用是把c#源码编译成通用中间语言(MCIL/CIL)的字节码(ByteCode)。最后运行的时候通过通用语言运行库的转换,终可以被CPU直接计算的机器码(NativeCode)。

  2. Mono运行时
    提供了一个即时编译器(JIT),以及一个提前编译器(AOT),同时还有类库加载器,垃圾回收和线程系统等。在非Window平台需要Mono运行时来编译。

  3. 基础类库
    与微软的.Net框架兼容

  4. Mono类库
    提供了很多超越基础类库,超越.Net框架的类。

Mono运行时

mcs的作用是将c#源码编译为ECMA CIL的字节码,之后则需要Mono运行时的编译器,将字节码转译为机器码。Mono运行时提供了3种转译方式:

  • 即时编译(JIT)
    在运行过程中,将CIL的字节码转为目标平台的原生码
    1.运行当中 2.生成的是新代码 3.还得运行
  • 提前编译(AOT)
    在运行前,将CIL的字节码转为目标平台的原生码并储存起来,但还是有一部分转译需要用到JIT
  • 完全静态编译(Full AOT)
    完全杜绝JIT,IOS平台

IOS不能热更代码原因:
原因:IOS封了内存(或堆)的可执行权限,相当于变相的封锁了JIT的这种编译方式。

CIL是什么

CIL是指令集。基于堆栈,而非通过CPU的寄存器来操作。和其具体的CPU架构无关。
CIL语言其实是运行在虚拟机中,具体到Unity 3D游戏引擎也就是Mono的 运行时。

举报

相关推荐

0 条评论