HotPatcher Versions Save

Unreal Engine hot update manage and package plugin.

v76.0

2 years ago

HotPatcher v76.0版本更新

  • 支持World Composition
  • 修复跨引擎版本的兼容性问题
  • 默认开启bCookPatcherAssets
  • 优化代码、修复4.27中的编译问题
  • 支持非侵入式给HotPatcher开发模块

HotPatcher/Mods下,可以基于HotPatcher二次开发新的打包和资源管理模式,充分利用HotPatcher的框架功能,能够拓展更多的功能:

  • 资源分析
  • 打包
  • 资源扫描、管理、审计
  • 多进程Cook
  • 不同形式的热更新方式

等等,根据业务的实际需求实现真正的定制化。

模块扩展示例

uplugin中添加HotPatcher的插件依赖:

"Plugins": [
    {
        "Name": "HotPatcher",
        "Enabled": true
    }
]

在build.cs中添加模块依赖:

PublicDependencyModuleNames.AddRange(new string[]{
    "HotPatcherRuntime",
    "HotPatcherCore",
    "HotPatcherEditor"
});

在模块的StartupModule中即可注册到HotPatcher中:

THotPatcherTemplateHelper::AppendEnumeraters<EHotPatcherCookActionMode>(TArray<FString>{TEXT("ByMultiProcess")});
FHotPatcherAction MultiCookerAction
(
  TEXT("Cooker"),
  LOCTEXT("ByMultiProcess", "ByMultiProcess"),
  LOCTEXT("MultiCookerActionHint", "Use multi-process Cook Content"),
  FSlateIcon(),
  nullptr,
  CREATE_ACTION_WIDGET_LAMBDA(SMultiCookerPage,TEXT("ByMultiProcess"))
);
FHotPatcherActionManager::Get().RegisteHotPatcherAction(TEXT("Cooker"),TEXT("ByMultiProcess"),MultiCookerAction);

效果:

基于HotPatcher的核心功能,可以根据需求定制化界面、拓展新功能。

v75.2

2 years ago
  1. 修复GIsRequestingExit警告
  2. Commandlet支持引擎Tick
  3. 支持特定资源类型的Cook/Ignore
  4. 支持GCookLog控制更多的Cook日志
  5. 支持导出Cook过程中进程加载的所有资源
  6. 修复开启CUSTOM_ASSET_GUID时的编译错误
  7. 修复派生类列表问题
  8. 支持CookClassesMode
  9. 修复Chunk过滤器文件夹头名字相同导致的进包问题
  10. 兼容UE4.21

v75.1

2 years ago
  • Fix memory leak when serializing asset registry
  • Fix Info.IndexHash.Hash Compiler error in 4.23

v75.0

2 years ago

本次更新包含大量的内容,修正了一些问题和重构部分功能,提升了跨引擎版本的兼容性。

  • 重构了Cook流程,并支持了几种不同的Cook模式,加速Cook过程
  • 统一编辑器Cook、Patch流程、MultiCooker使用的Cook流程
  • 移除CookManager支持
  • 支持Chunk内资源编译的shader打包,之前是整个Patch打包单个ShaderLib,并且支持给每个Chunk自定义ShaderLib路径、命名
  • 支持排除资源类型
  • 修复IsSkipAsset在ParallelFor Cooking过程中的Crash问题
  • Cook前清理旧Cooked文件
  • 添加了大量的Profiling Tag进行性能分析
  • 在修改引擎模式下,可以控制每个Cooker进程拉起的ShaderCompileWorker数量,避免操作系统进行频繁进程切换开销
  • 支持Patch版本号
  • 创建HotPatcherCore模块,与HotPatcherEditor模块分离,Editor只有编辑器部分逻辑
  • 修复序列化AssetRegistry的Crash问题
  • 修复Sandbox路径转换问题
  • 修复UE4Editor-cmd在非Development及32位模式下的问题
  • 清理冗余代码、接口、优化流程
  • 提升引擎兼容性,最低兼容至4.22(无ContentBrowser菜单相关功能)

v74

2 years ago

v74

  • 重构依赖分析模块,性能提升一个数量级(测试2w资源量提升约70倍)
  • 重构了从Paklist/Pak文件导入Release信息的模块
  • 优化实现,清理了大量冗余接口,整理代码组织方式
  • 移除AssetManagerEx模块,将UFLibAssetManagerHelper函数库移入HotPatcherRuntime
  • 修复4.25及之后的引擎版本中,由于引擎接口变动导致的RecursiveWidgetTree失效
  • 修复当开启基础版本比对时,bRecursiveWidgetTree分析不到部分父级UMG的情况
  • Patch支持PackageTracker,用来追踪不在依赖关系中但在ImportTable中的的资源,如动画序列的BoneCompressionSettings设置,详见Cook时的依赖加载注意:在编辑器中只有资源第一次加载或以Standalone模式执行时生效)。

bRecursiveWidgetTree的规则为:

  1. 若没有指定基础版本,则默认递归分析Patch中UMG资源的所有引用它的父级UMG控件
  2. 若指定基础版本,只会分析基础包中存在的父级UMG控件,避免带入非必要资源

资源依赖分析优化数据:

同时对Release的导出也有巨大提升,2w资源量:

  • 旧版本导出release总耗时568.635s
  • 新版本总耗时57.28s

v73

2 years ago
  • 支持CUSTOM ASSET HASH计算
  • 替换部分即将在UE4.27/UE5中废弃的API
  • Release添加bBackupProjectConfig,支持备份基础包的Config目录
  • 导出Release时支持NoCompileShader,避免因为加载资源导致的Shader编译,加速导出。
  • 优化代码,替换部分FString to FName、资源依赖扫描优化
  • 修复PackageTracker潜在的crash问题
  • 右键CookAndPakAction支持选择是否分析资源依赖

注意:在目前的版本中,获取uasset的HASH值是通过获取引擎内的PackageGUID,但是该属性即将在UE4.27和UE5中废弃,所以我添加了自定义的资源HASH计算支持,会计算原始的uasset文件的MD5值,用来替代即将废弃的PackageGUID(目前插件中并未开启,等UE正式废弃时会替换),对插件功能并无影响,但使用PackageGUID和通过计算MD5的Release*.json,不能通用,不然会造成全部的资源都具有差异。

想要现在就开启的话,可以在AssetManagerEx.build.cs中将bCustomAssetGUID=true即可。

v72

2 years ago

HotPatcher v72更新: Github 上的提交:v72 & optimize impl & fix mac issues & multi cooker

  • 修复 Mac 的 SVersionUpdater 的 Crash 问题
  • 修复 Mac Cook 时开启 share shader code 异常
  • 修复在 Mac 上的编译错误
  • 优化 Shader 收集流程,保证在 Cook 完毕之后才关闭 Shader 收集
  • 废弃 bIncludeAssetRegistry/bIncludeGlobalShaderCache/bIncludeShaderBytecode 三个选项,有更好的替代实现,详见 UE 热更新:Shader 更新策略

最近在做一个大更新,后续可以使用 HotPatcher 替换 UE 的 Cook 和分包机制,实现多进程甚至多机器的 Cook 任务分配,在基础包流程就可以使用 HotPatcher 进行管理,并加速 UE 的打包过程。不仅是热更方案了,拓展为一个完整的资源管理方案。

v70

2 years ago
  • 支持打包GameFeature/插件,在UE4.27/UE5中默认开启,详见文章:UE5:Game Feature预研
  • 重构Pak加密模块,支持从项目设置导入加密配置,并且与基础包加密方式对齐
  • 支持从Project Settings-Crypto的配置生成Crypto.json
  • 优化代码

注意:UnrealPak通过-encryptionini指定使用项目Ini配置的代码有Bug,会导致Crash,我的实现中完全抛弃了Ini,统一使用Crypto.jon