开源杂谈:HotPatcher的开发进展

Open source: HotPatcher development progress

距离HotPatcher的上次版本发布,已经过去了大半年的时间,对UE4的支持较好,但对UE5的支持欠缺,群里也频繁有人询问适配情况。

HotPatcher的上个Release版本是20230604发布的v81.0,只兼容了UE5.1.0,并且不支持WP和Nanite,后续Epic又推出了UE5.2和5.3,但插件并未适配。虽然可以自己修改编译错误,但功能支持在UE5里算是半成品状态。

趁着清明假期爆肝了几天,我对HotPatcher做了全面优化与适配支持,可以兼容UE4.21~UE5的最新版本,并且发布了一个新的Release版本:v82.0。本篇文章的后半部分会介绍HotPatcher在UE5中的适配情况、注意事项、以及更新日志。

另外,在2020年我曾经写过一篇文字:对开源的一些思考与想法,而过去这两年间,我对于维护开源项目的又有些新的想法,一起做个总结。

前言

HotPatcher这么久没有更新主要有下面几个原因:

  1. 工作繁忙,并没有太多业余时间来处理适配工作
  2. UE5的版本碎片化较为严重,而且每个版本的变动都很大,实现兼容多引擎版本比较麻烦
  3. 基于HotPatcher开发了很多Mod,也需要随着HotPatcher进行适配

需要的工作量还是很多的,并非之前完全没有进行适配工作,适配UE5和实现机制也做几次修改和验证。还要保证对UE5的支持不影响插件在其他引擎版本的兼容性以及对Mod的兼容,所以进展较慢。

经常在群里看到有人催促和询问UE5的适配情况,也只能无奈的表示有空了会搞。

维护开源项目其实是个非常费时间的事情,我又不考虑用它来盈利。当本职工作和个人生活时间都捉襟见肘时,对为爱发电的开源项目的支持只能往后安排了。

曾经有不少人跟我表示,愿意付费支持让我优先适配UE5,甚至还有公司想要买断我的适配版本,作为闭源工具。

但我不希望用它来进行商业化。这个项目是我从2019年开始开发的,到现在已经有五年的时间了。五年间写了很多代码,适配了很多引擎版本,并且保证了代码的跨平台和跨版本兼容性,同一份代码同时支持UE4.21~UE5,这非常不容易。

五年时间,这个项目就像是一手养大的孩子,收费或者卖掉,我都不会这么做。收费对我来说性质就变了,几年间付出的精力远远超出了它的金钱价值。而且目前已经有大量的商业项目中使用,卖掉它等同于杀鸡取卵的事情,出于道义也不能这么干。

我还是希望它能保持最初的样子,我只是喜欢写代码,喜欢让工具变得有用,能够产生更多的价值,这就是我觉得开心的事情。

关于收益,我没有从这个项目直接获得过收入。但是我博客有打赏渠道,偶尔会有朋友打赏十块二十多则几百的,总计也不超过几千块钱的样子,虽然不能都算作HotPatcher的捐赠收入,但总的来说聊胜于无。相比较金额,带来的情绪价值更高一些。

我一直觉得,开发工具类项目进行商业化,从来都不是一个好生意。而游戏方面的工具更甚,受众太窄,大多需求作为程序员自己都能搞,为什么要买别人的呢?而且能白嫖就不付费,盗版流行也是普遍情况。

文人相轻,程序员也相轻。

再者,如果我进行了收费,并且我的时间安排不允许我快速响应问题和适配版本,我就会很惭愧。不收费就没有什么心理负担。所以我宁愿免费开源,也不愿自己做的东西被说成恰烂钱。

为这些杂事搅扰心情,就本末倒置了。所以对这个项目而言,我坚持不做买卖,只靠捐赠。

而捐赠的收益不可预知,是完全不能够养活自己的。开源只能当作兴趣爱好,不能当作谋生手段。

所以未来我对于开源项目的维护和支持,可能都会保持一个比较低的更新频率和精力投入。先做好本职工作和生活,有余力再去为爱发电吧。

适配UE5

下面来谈一谈HotPatcher对UE5的适配情况。

目前HotPatcher对于UE5的适配已经完成,对所有类型的资源都能够正常打包和挂载,并且支持WP和Nanite。我在UE5.3.2、5.2.1、UE4.25与4.27均经过验证,并未发现明显的问题。

UE4的引擎依然可以开箱即用,但UE5的就稍微复杂一些。由于目前UE5引擎的BUG,导致HotPatcher的一些功能无法UE5上正常工作,需要用源码版引擎做些修复处理。

虽然我在适配时做了很多努力,希望纯由插件实现,尽可能地不去修改引擎,但是毕竟插件能做的有限。UE的一些代码实现我真的忍不住想喷一句真是一坨狗屎

下面讲讲具体的BUG以及修复流程。

  1. UE5.3.2出现FShaderMapResource_InlineCode::CreateRHIShaderOrCrash的Crash问题(UE5.2未发现该问题)

在UE5.3.2中,当打包了包含Shader的补丁时,会产生下面的崩溃:

1
2
LogOutputDevice: Error: Ensure condition failed: oldValue == newValue  [File:D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Private\HAL\ThreadingBase.cpp] [Line: 311] 
LogOutputDevice: Error: oldValue(1) newValue(0) If this check fails make sure that there is a FTaskTagScope(ETaskTag::EParallelRenderingThread) as deep as possible on the current callstack, you can see the current value in ActiveNamedThreads(102), GRenderingThread(6110a4c0), GIsRenderingThreadSuspended(0)

修复方法:去掉CreateRHIShaderOrCrash中对IsInParallelRenderingThread()的调用。Epic已经获知这个问题,会在UE5.4中修复。

  1. CookOnTheFlyServer中,FShaderLibraryCooker::EndCookingLibrary并未受引擎bShareMaterialShaderCode控制的问题。

正常来说,只有PackageSetting->bShareMaterialShaderCode为true,在CookOnTheFlyServer中才会执行FShaderLibraryCookerInitShutdown。但是在UE5中,只有Init相关的逻辑做了检测,而Shutdown完全没有检查,任何时候都会执行。

它会导致HotPatcher在打包ShaderLibrary产生错误,无法正常执行COOK。只能在Patch的配置中不勾选SharedShaderLibrary或者修复引擎代码。

修复方案:

  1. 修改CookOnTheFlyServer.cpp里的实现,把FShaderLibraryCooker的操作加上bShareMaterialShaderCode判断。

  2. 或者在HotPatcher的打包配置中关掉SharedShaderLibrary

这两个问题完全都是UE自己的BUG导致的,在插件层面无法解决。期望在UE5中使用HotPatcher的人,都要自己在引擎中修改这两处,才能使HotPatcher所有功能正常工作。

同样的,第二个问题也导致了Launcher版本的UE5引擎,无法正常使用HotPatcher正常打包ShaderLibrary的Pak,要么使用InlineShader,要么必须要使用源码版。

虽然我坚持同一份代码做版本兼容,引擎的这些BUG让强迫症的我比吃了苍蝇还难受,但也没有办法。在UE主干解决之前,只能按照我上面介绍的方式使用。

更新日志

v82.0

v82.0相较于上个版本,进行了大量优化和BUG修复。

不管在哪个引擎版本中使用HotPatcher,都强烈建议你更新到最新的版本,出现问题也便于排查。

更新内容如下

  1. 修复在某些情况下*.m.ubulk文件未被打包进去的bug
  2. 优化了PAK的打包耗时,对大量文件的扫描做了缓存和多线程优化,大幅提升打包速度
  3. 支持Accompany的COOK模式
  4. 添加了更多的性能标记
  5. 优化日志级别
  6. 支持cache-ddc-only的Cook模式
  7. 模块启动时自动加载../../../PROJECT_NAME/ShaderLibs目录下的所有ShaderLibrary
  8. 支持Nanite和WP的COOK
  9. WP的差异更新支持(由于WP的One File Per Actor机制,修改WP场景并不会导致关卡资源本身的变动,我扩展了一种检测机制,可以实现WP的差异检测)
  10. 优化FExternFiles的访问
  11. 优化Release记录的外部文件从绝对路径变为标记路径
  12. 修复在UE5中COOK时产生假文件的问题
  13. 修复导出release时的路径包含//的问题
  14. 修复PatcherProxy获取到PackageTracker不准确的问题
  15. 优化PackageTracker的实现,剔除已经Track到的资源
  16. 优化PackageTracker,可递归Tracker分析
  17. 统一CollectPakCommand中ParallelFor的锁,避免竞争问题
  18. 支持-AddAssetsByFile=参数传递一个LongPackageName的列表打包
  19. 修复ShaderLib未被打包进pak的问题
  20. 允许在Cook的Cmdlet里添加Pre与Post任务
  21. 优化插件Slate实现,在Toolbar中支持二级菜单,直接选中打开对应的页面
  22. 支持监听进程的Crash,并会将Crash文件存储到Saved/HotPatcher/Crashs
  23. 兼容GameFeaturePacker与ShaderPatcher两个Mods(均需更至最新)

目前v82.0已经正式发布,可以从hxhb/HotPatcher拉取和更新。旧版本插件打开Patch页面也会有新版本的更新提示。

补充资料

Update by 2024-04-13 13:45

对于WP地图的更新:添加一些补充资料。

对于普通的地图而言,修改了蓝图基类,会自动触发子蓝图和引用到它的地图的变更:

但对于WP而言,情况就复杂一些:

  1. WP开启了one file per actor,修改蓝图不会触发地图的更新
  2. 需要针对这种情况实现分析逻辑,会在下个版本中发布。

捐赠

如果HotPatcher项目有帮助到你,并希望HotPatcher以后能够做的更好,可以扫描下方的捐赠二维码支持作者。

微信支付 支付宝

您捐赠后可以点击HotPatcher捐赠者信息收集表,提交您的捐赠信息,我会不定期收集展示在项目页面中。

结语

HotPatcher经过5年的开发与发展,目前已经成为最为流行的资源管理和打包方案。此次更新兼容UE5和做了大量优化,我希望它能在UE5世代的引擎中,继续发光发热,产生更多的价值。

全文完,若有不足之处请评论指正。

微信扫描二维码,关注我的公众号。

本文标题:开源杂谈:HotPatcher的开发进展
文章作者:查利鹏
发布时间:2024年04月07日 10时01分
本文字数:本文一共有4k字
原始链接:https://imzlp.com/posts/16808/
许可协议: CC BY-NC-SA 4.0
文章禁止全文转载,摘要转发请保留原文链接及作者信息,谢谢!
您的捐赠将鼓励我继续创作!