Unity 热更新基础知识

发布于:2025-02-10 ⋅ 阅读:(39) ⋅ 点赞:(0)

0.参考文章

https://zhuanlan.zhihu.com/p/685026219

1.一些名词

  • IL(Intermediate Language):中间语言(类似于汇编代码)
  • CIL(Common Intermediate Language):公共中间语言(特指在.Net平台下的IL标准)
  • CLR(Common Language Runtime):公共语言运行时,其实就是一个虚拟机,C#程序运行时都会启动它,它负责将IL翻译为对应平台的机器码,内存管理等

2.三种编译方式

  • JIT(Just in time):动态编译/即时编译
    编译时:C# => CIL
    运行时:CIL => 各平台机器码 => 执行(虚拟机CLR,JVM的工作)
    优点:编译时间短
    缺点:运行速度长
  • AOT(Ahead of time):静态编译/提前编译
    编译时:C# => CIL => 各平台机器码
    运行时: 执行 (仍有部分JIT模式)
    优点:运行速度快
    缺点:编译时间长
  • Full AOT(Full ahead of time):完全静态编译
    在AOT模式上去掉所有JIT编译 (ios只支持该模式)

3.Unity 两种脚本后端

3.1 Mono

在这里插入图片描述

3.2 IL2CPP

在这里插入图片描述

C++是不带托管内存的,也没有GC,所有内存都需要程序员自己管理,但我们在编写C#的时候是没有显式管理过内存的,所以为了支持C#的自动内存管理,IL2CPP运行时也有一个虚拟机在跑,虚拟机在托管着我们代码中分配的内存。

3.3 对比

特性 Mono IL2CPP
编译方式 即时编译(JIT),运行时编译代码 静态编译(AOT),将IL转换为C++,然后编译为机器代码
性能 性能较低,尤其是在复杂计算和大量对象时 性能较高,适合高性能要求的游戏和应用
平台支持 广泛支持,适用于大多数平台(但对iOS支持较差) 支持大多数平台,尤其是iOS、Android和Windows,必须在iOS上使用
胞体大小 通常较小(因为使用JIT,C#代码未完全转为机器码) 通常较大(因为C#代码转为C++,需要生成完整的机器码),因此需要执行代码裁剪
构建时间 构建时间较短 构建时间较长,因涉及C++代码生成和编译
内存管理 使用GC垃圾回收,可能导致延迟回收 也使用GC,但在内存管理方面通常有更好的性能优化
功能支持 支持更多动态功能,如反射、动态类型创建等 对反射等动态功能支持较弱,需要额外处理
适用场景 适合开发阶段和对性能要求不高的应用,快速迭代 适合发布到生产环境,特别是对性能要求较高的应用和游戏