HybridCLR热更详解

HybridCLR热更方案详解

一、热更流程

  1. 程序入口

  2. 初始化AOT脚本

Ahead of time 运行前编译

  1. 下载热更资源

不论是美术资源还是热更dll都是打包成AB包下载到本地

  1. 加载热更dll
1
2
3
4
// 加载dll资源
var dllBytes = await AssetComponent.LoadAsync<TextAsset>("Assets/Dlls/mygame.bytes");
// 加载程序集
Assembly gameAss = System.Reflection.Assembly.Load(dllBytes.bytes);
  1. 加载补充原数据dll

如果热更程序集引用了AOT程序集就需要执行该步骤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private static void LoadMetadataForAOTAssemblies()
{
// 前三个为unity自带 其余的为自己应用程序的AOT程序集
List<string> aotMetaAssemblyFiles = new List<string>()
{
"mscorlib.dll",
"System.dll",
"System.Core.dll",
"myGame.Framework.dll"
};
HomologousImageMode mode = HomologousImageMode.SuperSet;
foreach (var aotDllName in aotMetaAssemblyFiles)
{
byte[] dllBytes = BetterStreamingAssets.ReadAllBytes(aotDllName + ".bytes");
LoadImageErrorCode err = RuntimeApi.LoadMetadataForAOTAssembly(dllBytes, mode);
Debug.Log($"LoadMetadataForAOTAssembly:{aotDllName}. mode:{mode} ret:{err}");
}
}
  1. 加载热更场景,执行热更代码

AOT代码无法直接调用热更代码,一般在下载完所有资源,热更代码都加载完成后,通过加载热更资源中的场景,场景上挂载热更脚本,进行后续的游戏初始化

二、程序集

  1. 程序集划分

对于热更只需要考虑如何划分AOT程序集和JIT程序集

  • AOT程序集一般包含基础框架和第三方插件等不会有大变动的内容
  • JIT程序集作为热更相关程序集
  1. Assembly-CSharp

该程序集是Unity默认的特殊程序集,我们自行添加的代码如果没有专门划分程序集,就都会被丢入这个程序集或 ~-Editor 程序集

如果勾选了Auto Referenced,默认程序集可以访问项目内所有的程序集,相当于位于程序集引用关系的顶部

一般来说将这该程序集定义为AOT程序集,不引用任何热更程序集,下载热更资源和加载dll等操作就均可以在这里去实现

  1. Assembly Definition

.asmdef文件 将项目脚本分成具有明确定义的依赖关系的多个程序集,以确保在脚本中进行更改时仅重建对应的程序集,以此减小编译时间

  • 添加自定义宏(Define Constraints)
  • 添加程序集依赖(Assembly Definition References)
  • 选择目标平台(Platform)

HybridCLR热更详解
https://baifabaiquan.cn/2023/03/15/HybridCLR详解/
作者
白发败犬
发布于
2023年3月15日
许可协议