ChuanXin 发表于 2022-7-5 22:15

Unity huatuo 革命性热更系列【3】

1.3 huatuo示例项目源码分析与启发
上一节我们安装huatuo的开发环境,然后运行示例项目,体验了huatuo做热更新,这节课我们来分析示例项目的源码,掌握huatuo做热更新的主要的步骤,让你自己的项目很好的基于huatuo来组织热更新。有几个huatuo的原则要清楚:

[*]Unity ADF机制来分项目,可以分成若干项目,避免大量代码长时间的编译,同时可以按照更小的颗粒度来做热更新。
[*]普通开发中,会把Unity项目的代码通过IL2CPP全部转成静态的二进制指令代码,如果当IL2CPP_huatuo加载了一个IL代码的.dll(既有AOT的静态代码,又装载了对应的IL代码),huatuo会优先解释执行装载的IL代码。每个版本都把.dll生成出来,进行比对,哪些.dll变化了,就采用il2cpp_huatuo下载下来,转载执行即可。
[*]任何项目的代码(框架代码+游戏逻辑)都可以基于huatuo来做热更新。
[*]huatuo提供热更的机制,至于如何热更,热更哪些完全由自己控制;

我们带着这些原则来对示例项目来做源码分析得到自己开发项目中的启发。

启发1: 游戏代码如何分工程与项目

传统的我们的热更新项目会分为:框架代码+游戏逻辑。你也可以按照这个标准来划分,也可以继续分更小的颗粒度,比如游戏逻辑,可以拆分为:战斗,任务等。所以我们在使用huatuo做热更新的时候它首先做的是项目拆分,示例代码中利用Unity 的ADF机制,将项目分成了几个工程如下:
   Assembly-CSharp.csproj:默认的代码工程,新建代码默认会被拉入到这个工程编译;
   Assembly-CSharp-Editor.csproj:编辑器Editor代码会被拉入到这个工程编译;
   BetterStreamingAssets.csproj: 示例项目中的资源ab包加载工程;
   HotFix.csproj: 示例项目中测试热更的测试工程;
   HotFix2.csproj: 示例项目中的第二个测试工程;
   Main.csproj: 示例项目中入口主工程,示例项目从这个入口工程的代码开始运行;
这里给到我们的启发,我们在做自己游戏项目的时候,也可以根据自己的项目需求利用Unity ADF机制,来将项目划分称若干工程,而这些工程,可以单独的生成IL的.dll代码指令。这样就可以给IL2CPP_huatuo来解释执行了。由这里得到的启发,我们用huatuo做项目的时候我会将项目如下划分,供大家参考:
   Assembly-CSharp.csproj:默认的代码工程,这里放启动代码,放热更新版本检测代码,检测出来哪些.dll需要更新,基于增量下载更新,比较出哪些不用更新使用原来自带的AOT内部的代码,哪些需要更新,需要更新的用il2cpp_huatuo来装载进来,优先执行装载进来的.dll指令。
   Main.csproj:可以用来做框架工程,实现各个框架模块,初始化框架,进入具体游戏逻辑,提供基础的服务,如SDK服务等。这个是传统热更的框架层,一般情况下不用热更,使用AOT后的代码就可以了,如果万一要热更,也可以直接热更生成的main.dll。
   若干业务逻辑项目工程: 根据游戏的类型来进行区分若干游戏项目,根据版本比对决定这些.dll是否需要被il2cpp_huatuo虚拟机装载。
启发2: 扩展编辑器来生成所有.dll

由huatuo的特性,你装载哪个.dll,就可以动态解释执行对应的.dll的代码指令。所以我们就可以得到启发,把我们项目中所有的除Assembly-CSharp.dll以外的.dll都生成出来。比如1.0版本: Main.dll(游戏框架), game.dll(游戏主逻辑), task.dll(任务系统), …比如2.0版本: main.dll, game.dll, task.dll, …。这样每次打包发布的时候,我们就可以使用这个编辑器扩展,编译出来所有的项目中的.dll,并生成一个所有.dll的md5文件变化列表。把最新的一份.dll与md5文件列表放服务器,把本地md5文件列表放包里,每次运行,我们增量下载最新版本的.dll后,我们只要比较服务器上的.dll md5文件列表,与当前版本对应.dll的md5文件列表,决定出哪些.dll需要装载进入il2cpp_huatuo,就直接装载即可实现热更新,那些没有变化的.dll,表示可以直接使用AOT模式下的机器指令,不用热更解释执行IL指令的.dll。我们来看下示例项目里面是如何编译我们的.dll指令的,参考对应的编辑器的扩展代码。打开示例项目的Editor/Huatuo文件夹的EditorHelper.cs, 如图:




没有什么可说的,调用API,打包.dll,直接copy过来就可以了。根据我们上面的分析,对.dll生成不同版本的.dll md5文件列表这个需要自己扩展一下,示例代码中没有。

启发3: 要热更哪部分代码,就装载哪部分代码

使用huatuo做热更新最后需要掌握的一个点就是,如何装载.dll的代码,当我们知道当前系统需要装载哪些.dll让huatuo解释执行后,最后一步就是让huatuo来装载,我们从这个示例项目的代码中可以看到il2cpp_huatuo是如何装载一个.dll的,当这个.dll被装载后,这部分的功能就被解释执行了。Huatuo如何加载代码,我们可以参考示例如下(代码来自LoadDll.cs):


它分为了发布模式与Edtior模式,发布模式就是直接把.dll装载进入il2cpp_huatuo的vm中,调用API函数: System.Reflection.Assembly.Load(.dll的二进制文件内容),在底层huatuo做了修改。编辑器模式下,调用AppDomain就行装载就可以了,所以这个代码我们直接可以参考拿过来,比较出哪些.dll要热更,我就转载它就可以了。



今天的分享就到这里了, 关注我们, 接下来还会继续更新huatuo热更的系列教程。
下节预告: 打造基于huatuo 热更的项目框架
页: [1]
查看完整版本: Unity huatuo 革命性热更系列【3】