通过……不使用不必要的安全哈希方法来加速 Unreal 编辑器
摘要
一篇工程博客分享了如何通过将 Unreal 编辑器着色器哈希从缓慢的 SHA1 替换为引擎内已有的 xxHash,从而加速编辑器启动与资产处理。文章强调应避开已被高度优化的代码路径,转而寻找被忽视的低垂果实。
<p><a href="https://lobste.rs/s/5feguu/speeding_up_unreal_editor_by_not_using">评论</a></p>
查看缓存全文
缓存时间: 2026/10/12 21:50
# 提升 Unreal 编辑器速度——通过不使用不必要的安全哈希方法
Source: https://larstofus.com/2026/10/11/speeding-up-the-unreal-editor-by-not-using-unnecessarily-secure-hash-methods/
在寻找软件优化方案时,一个很好的技巧是远离那些很可能已经被充分优化的区域,转而关注那些可能被忽略的地方——要么因为它们太冷门,要么因为在常规性能分析中根本不会出现。这个策略过去效果很好,比如我之前对工具提示创建的优化(https://larstofus.com/2025/09/02/speeding-up-the-unreal-editor-launch-by-not-spawning-38000-tooltips/),以及编辑器本地化文件加载的优化(https://larstofus.com/2025/09/02/speeding-up-the-unreal-editor-launch-by-not-spawning-38000-tooltips/)。
所以当(再次)对编辑器启动进行性能分析时,这就是为什么我基本上会跳过所有包含 "Shader Compilation" 或 "Shader Source" 等关键词的函数。着色器编译是一个出了名的漫长而复杂的过程,我非常确定 Epic 里那些非常聪明的人已经在这些区域花费了大量时间进行优化。这就是为什么,例如,我会跳过 "Compile Global Shader Map" 这个函数,尽管它的运行时间通常长达数秒:
至少在我以异常高的缩放级别跳过它并看到它调用的其中一个函数之前,这都是正确的:
我当然不是哈希算法方面的专家,但 SHA1 是连我也知道的(极少数)哈希算法之一。看到这种哈希算法被用来对着色器进行哈希处理,不知怎么让我觉得不太对劲。因为 SHA1(https://en.wikipedia.org/wiki/SHA-1)曾经是一个密码学安全的哈希算法,最初由 NSA 开发(没错,就是那个 NSA)。虽然它多年前在密码学上已被破解,实际上不应该再用于敏感信息,但这个出身意味着它——客气点说——速度并不快。在这个语境下"不快"是什么意思?可以看看 Aras Pranckevičius 几年前做的这个常见哈希算法对比测试(https://aras-p.info/blog/2016/08/09/More-Hash-Function-Tests/)(实际上是 10 年前——我老了)。SHA1 甚至没有被作为真正的竞争者,正如文章开头所指出的,它只是被包括进来"以展示性能差异"。真惨。这尤其令人恼火,因为被哈希的数据就是着色器源代码,包括所有注释和版权声明:
这意味着我们既需要对大量数据进行哈希(源文件可能相当大),而且没有必要使用密码学安全哈希来处理,因为这些根本不是敏感数据。
因此,使用一个快速而非密码学安全的哈希算法应该是一个轻松的胜利,对吧?而所引用的那篇文章已经提出了一个很好的替代方案,我甚至在 Unreal 的代码库中找到了一个现成的实现:xxHash。
在有人提问之前先说明:xxHash 不一定是最快的哈希。其他可能更快的哈希确实存在(https://aras-p.info/blog/2026/03/07/Rapidhash-Unity-port/),但目前,使用一个已经在我们所使用的引擎中经过测试的更快哈希是更直接的选择。更改所使用的哈希并不太复杂,尽管我需要改动的代码位置比预期的要多,因为所有存储或传递生成哈希的位置都需要同步更新。这个更改的一个好的副作用是存储的哈希比之前小了一些(8 字节而不是 20 字节)。但当然,我做这个更改的目的不在于内存,而在于 CPU 时间。为了测试,我用修改前后的引擎各 5 次在编辑器中打开了 Unreal 自带的示例项目 Electric Dreams(https://www.fab.com/listings/d79688f5-29be-4fb2-a650-2d4a813f5306?lang=en),总共 10 次运行。性能分析使用 Superluminal(https://superluminal.eu/)完成。
为了方便理解下面的数字,我要说明的是,我主要讨论的是所有线程的总 CPU 时间,而不仅仅是游戏线程上的时间。这样做不是为了人为地夸大数字,而是为了让数字更一致、更容易比较。对编辑器启动时间的实际影响(非常粗略地)是测量时间除以核心数。
在原版引擎中,有惊人的 12.90 秒花在了 FSHA1::Update 上。在使用 xxHash 的修改版本中,这个时间缩小到仅 1.59 秒花在了 FXxHash64Builder::Update 上。快了八倍!任务完成。
通常,这篇文章现在会以一个指向 pull request 的链接结尾,这样任何对这个更改感兴趣的人都可以在等待和期望 Epic 的某人看到该 pull request 并将其合并到主分支的同时,将其集成到自己的引擎版本中。而这次我有更好的消息:这个更改已经被接受了!(不过尚未合并,似乎还需要几天时间)我在写这篇文章前几天提交了 pull request(https://github.com/EpicGames/UnrealEngine/pull/15237),而这几天已经足够让 Epic 的某人不仅审查了我的更改,还对其进行了完善。那么让我们来看看对我的提议所做的部分修改:一个我没想到的非常聪明的处理是将 xxHash 包装到另一个结构体 FShaderHash 中。这目前不会改变行为,但如果未来需要使用更快的哈希算法,将更容易再次更换哈希算法,而无需在许多不同位置修改代码。修复了非编辑器构建的编译错误:那是我的疏忽。我只在编辑器构建中测试了我的更改,主要是因为我的原始性能分析也是在编辑器中完成的。未来我可能需要将非编辑器构建加入我在提交 pull request 前需要执行的检查清单中。就是这样了。如果你喜欢这篇文章并希望未来阅读更多关于游戏优化的内容,可以考虑在 BlueSky(https://bsky.app/profile/larstofus.bsky.social)、Mastodon(https://mastodon.gamedev.place/@LarsThiessen)或 Linkedin(http://www.linkedin.com/in/larstofus)上关注我,我在那里发布我所有的文章。或者直接在文章下方订阅我的博客。
相似文章
在ARM64上加速gearhash(性能提升2倍)
本文介绍了对 `gearhash` Rust crate 的优化,新增了 NEON 后端,使 ARM64 架构上的性能提升一倍,改进了内容定义分块(如 Hugging Face 的 Xet 客户端等应用场景)。
@rauchg:“重要的是最终产品,无论是游戏还是引擎”。说得好!
rauchg 吊推并附和 Tim Sweeney 关于 Unreal Engine 1 开发经历的名言:“重要的是最终产品,无论是游戏还是引擎”,Sweeney 回忆当年 70% 时间只是打字编码,30% 才是攻克底层难题。
@garrytan: 一方面,一个做对的编码工具可以说是语法糖;另一方面,我见过真正的加速……
Garry Tan 分享了他使用一个编码工具的经验,该工具提升了开发速度,用于修复问题和实现功能,且没有增加编辑器内时间。
@thinkszyg: AI 编程速度悖论:写代码快了 48%,Review 慢了 6 倍。Review 流程怎么重建? SD Times 分析 25 万开发者数据:AI 让编码提速 48-58%,但 AI 生成的 PR 在 Review 环节卡 4-6 倍时间…
文章指出AI编程使编码速度提升48-58%,但代码审查时间增加4-6倍,安全漏洞增加,并提出了三步重建审查流程的方案,包括AI预审、聚焦架构决策、以及使用微软开源的ASSERT框架进行行为验证。
@xingbugengming: 如何用 Codex + Unreal 做游戏? 花了一周的时间,我将全战三国和骑马砍杀的经典玩法融合到了一起,用 AI 自制了一个小游戏 为此,我将开发流程汇编成一段视频,给大家提供制作思路,还有很多的地方没有完善,仅供参考
作者分享了如何结合 Codex 与 Unreal Engine,在一周内将《全面战争:三国》和《骑马砍杀》的经典玩法融合,用 AI 自制了一款小游戏,并将开发流程整理成视频供他人参考。