4 月:性能与优化!
性能与优化!

欢迎阅读我们上个月最新更新的汇总!
脚本改进
以下是本月的脚本改进!
AI 避障方法
这是社区的要求,我们新增了一个方法来控制角色的 RVO(互惠速度障碍)。
这是一个 AI 系统,通过基于周围其他 NPC(或 RVO 角色)进行额外计算来确定 NPC 的速度和方向,使它们在移动时避免相互碰撞。
我们默认启用了此功能,但通过新方法 Pawn:SetAIAvoidanceSettings() 提供了按需禁用它的方式,以允许自定义此行为。
Esc 键覆盖
你们中的许多人要求更好地处理 Esc 键,尤其是菜单导航方面。我们现在可以在脚本中注册 Esc 键了。
Input.Bind("Menu", InputEvent.Pressed, function()
-- 使用示例代码
if (is_my_menu_open) then
CloseCustomMenu()
return false
end
end)
如果玩家持续按住 ESC 一段时间,游戏菜单仍会照常打开,确保他们不会被困在你的服务器中。
DLSS 4 完整集成
最近我们将 DLSS 集成升级到了最新的 DLSS 4,为现有技术带来了大量改进以及新功能多帧生成(尽管仅支持新的 RTX 50)。
为了跟上进度,我花时间完成了 nanos world 中 DLSS 的集成,因为我们之前只支持超分辨率和帧生成(2x)设置。
所以我们现在完全集成了:

超分辨率
所有 DLSS 超分辨率设置现在完全集成到界面中。启用 SR 将自动禁用分辨率缩放和抗锯齿,因为 SR 内部处理这些。
你可以通过比较超级性能模式(仅建议 8K 分辨率使用)和关闭时的性能差异:


帧生成
我们已将帧生成正确集成到 UI 中(需要关闭垂直同步并开启 Reflex)。也支持多帧生成。如果你有 RTX 50,请告诉我们对你的效果如何! 😅
你可以在对比中看到,它几乎使呈现的帧数翻倍(我们将其显示在单独一行,因为它只使呈现的帧翻倍——而不是游戏帧):


光线重建
这是一个新的集成,可改善复杂光照和阴影场景中的图像质量,你可以看到启用后阴影伪影消失,注意它有一点性能开销:


锐度
我们还新增了一个滑块,如果需要可以调整 DLSS 锐度。
Reflex 低延迟
Reflex 低延迟减少输入延迟,使游戏手感更流畅、响应更灵敏,你可以看到输入延迟的差异:


崩溃与 Sentry
与任何开发中的游戏一样,崩溃会发生,但我们需要了解它们才能修复它们。你可能以前遇到过虚幻崩溃报告器屏幕,但我们现在集成了一套新的 SDK,通过新的 Sentry 虚幻插件来捕获崩溃。
Sentry 是一个记录游戏崩溃、致命错误和上下文信息的工具,并将其发送到我们自己的服务器。
我们之前已经在客户端和服务器上使用了 Sentry,但现在我们更原生地将其集成到客户端,帮助我以更有用的信息跟踪和接收游戏崩溃和错误。
通过这个新集成,我们摆脱了那个通用丑陋的虚幻崩溃报告器,目前我们有了这个新的另一个丑陋的弹窗,在崩溃发生时显示:
我们现在能够获得更丰富和上下文相关的信息,更有助于追踪崩溃的真正原因。无需那么多地不断询问可复现步骤。
性能分析
虚幻有一个很棒的工具叫做 Unreal Insights。它是一个遥测工具,捕获并分析游戏的每一帧,准确告诉我们瓶颈以及哪些方法造成瓶颈。
我开始使用它是因为发现 nanos world 存在一些瓶颈,我找到了很多,帮助修复了几个性能问题:

性能分析调试
我改进了性能分析调试部分,现在它显示每个操作每秒花费的时间、调用次数、每次调用的平均时间以及最后一秒内操作的最大耗时(峰值)。
此外,我挂钩了虚幻的计时,还显示虚幻全局 Tick 和 Slate Tick 时间:

新的“帧时序”部分显示帧、游戏、渲染、RHI 和输入时间
还有“性能分析”部分,包含新的时序列和新的虚幻条目(世界 Tick 和 Slate Tick)
FPS 时序
我集成了我们自己的面板来显示 FPS 和时序,取代了虚幻的绿色覆盖层。这可以在调试设置中的新下拉菜单中激活:
正如你在上面的性能分析调试中看到的,现在你可以看到游戏中运行的所有时序和线程:
- 游戏:主执行线程(虚幻 Tick、计时器、网络、Lua 代码、UI 等)运行帧所花费的时间。
- 渲染:渲染线程为 RHI 线程准备命令所花费的时间
- RHI:(渲染硬件接口)DX11 或 DX12 线程向 GPU 发送操作所花费的时间。
- GPU:GPU 渲染帧所花费的时间。
- 输入时间:按下输入与游戏响应之间的延迟。
游戏线程将始终等待其他线程完成(等待赶上渲染线程落后的一到两帧),因此你可以通过分析哪个时序等于帧时间来确定你的游戏模式瓶颈在哪个线程。
你可以在 Epic 的文档页面线程概述中了解更多关于这些时序和虚幻线程的信息。
游戏性能++
得益于 Unreal Insights 和新的性能分析时序,我成功识别并修复了我们遇到的几个性能问题:
控制台冻结修复
控制台打开时不再卡顿!我们曾遇到使游戏冻结数秒的情况,但现在已修复!

测试地图导航网格体
一段时间以来,我们的 default-testing-map(已经有些年头了 😅)开始表现非常糟糕。 FPS 不太好,我们可以清楚地看到 GPU 没有被充分利用(我们有主线程(CPU)瓶颈)。
通过分析帧,我发现罪魁祸首是它的导航网格体每帧都在重新计算(因为我们使用动态导航网格体生成),在游戏线程上花费了巨量时间。
然后我最终发现原因是地图中的一些物体导致了这一点:
那个静态船

这艘船只是地图中启用了浮力的角色,但它启用了“甚至能影响导航”设置,导致其周围所有导航网格体每帧都被重新计算。
道具

另一个也在影响导航网格体的逐渐增多的实体是道具。它也启用了影响导航开关,当地图中有大量道具时性能被急剧消耗。
当然这可能会造成一些缺点,比如 NPC 穿过道具并将它们踢开,但性能提升是不可估量的。此外我正在研究添加新方法以编程方式启用/禁用道具影响导航网格体的可能性,所以如果你真的需要,可以按道具启用。
这个修复绝对是一个巨大的改进,现在在测试地图上游玩流畅多了非常明显。
这些改进不仅会改善测试地图,还会改善游戏中的所有其他地图,包括你的!
测试地图阴影
我们遇到的另一个问题是测试地图的光照/阴影,我们为所有草地网格体启用了动态阴影,这通常是一个糟糕的决定,因为它消耗大量 GPU 性能。
所以我将所有草地阴影改为使用接触阴影方法,它效率高得多,视觉效果非常相似:


此外,我们的火把在靠近时导致巨大的 FPS 损失,你可以看到直视它时花费了近 4ms。
通过改用接触阴影,我们注意到巨大的性能提升(阴影深度通道从 ±4.35ms 降至 ±2.26ms),释放了大量 GPU 使用:


角色 Tick
此外,我发现在游戏 tick 中,有很多角色和组件每帧都在 tick,即使它们未被激活或使用,这占据了主线程帧时间的相当大比例。
仅举几个例子:
- 武器一直启用了多个 Tick,用于计算血液防抖或射击节奏等,现已改进为仅在我们拾取武器时才激活它们。
- Pawn(Character 与 CharacterSimple)有大量组件和其他网格体处于活动并 tick 状态,例如非主控玩家的降落伞或物理手柄,所以现在根据需求按需启用/禁用。
在其他小改动中,性能和优化现在进一步改善,允许同时生成更多实体。
测试地图改进
其他测试地图改进:
火把开/关

旧的昼夜火把系统已修复,现在它根据一天中的时间自动开启/关闭。
它通过挂钩 Ultra Dynamic Sky 的时间来检测是白天还是夜晚。
环境音效
旧的环境音效也已修复并重新放置,根据一天中的时间自动循环白天和夜晚的声音。
减少树木

我减少了测试地图中的树木数量,因为某些区域树木导致视觉清晰度差,甚至对性能产生负面影响。
次要荣誉提名
一些小的改进:
主菜单 FPS
主菜单现在上限为你的显示器刷新率(之前上限为 120)。
虚幻更新 5.4.4
虚幻版本已更新至最新补丁版本 5.4.4,此更新中不应有任何烘焙资产损坏。
结语
这个月对优化爱好者(像我)来说是一次巨大进步,解决了多个低层和高层性能问题,更不用说新的 DLSS 功能为一切增加了另一层优化。
衷心感谢每一位为达成我们的“让开发者保持清醒基金” Ko-fi 目标 做出贡献的人 ☕!你们绝对震撼了!你们的支持让这个项目蓬勃发展,也让我保持咖啡因充足。 😅
另外,由于 Ko-fi 捐款会随时间累积,我已将其更新为“按月”目标。
幕后有很多东西正在酝酿,一些大事即将到来™!一如既往,感谢你参与这段旅程! 💙
下次见!


