Unreal Engine

性能 指南

本页内容

    本页内容

    Unreal Engine 性能指南

    Unreal Engine 是领先的游戏、设计可视化、电影制作等开发环境。在进行 Unreal Engine 开发时,与任何实时应用程序开发一样,对应用程序进行性能剖析以确保满足性能要求非常重要。

    本指南旨在提供有关使用 Unreal Engine 进行性能剖析和优化的实用建议。本指南的当前版本侧重于 GPU 性能的剖析和优化。

    您可以在以下链接找到我们的 FidelityFX Super Resolution Unreal Engine 插件:

    FSR 3 | FSR 2 | FSR 1

    在 Unreal Engine 中进行性能剖析性能剖析部分从有关使用 最佳剖析配置 来设置的极佳建议开始,然后涵盖了 结果降噪可重复剖析内置剖析工具 等主题。
    使用 Radeon™ GPU Profiler (RGP) 进行性能剖析我们的强大剖析工具 Radeon™ GPU Profiler (RGP) 可与 Unreal Engine 一起使用。本节介绍 RGP,解释如何 与 Unreal Engine 一起使用它识别 CPU 与 GPU 瓶颈,并描述一个基于我们的 Unreal Engine 案例研究的 示例用法场景
    在 Unreal Engine 中进行优化了解一些关于从头到尾优化整个 Unreal Engine 帧的宝贵通用建议,包括最新的 UE5 功能:NaniteLumen虚拟阴影贴图超级分辨率向上缩放器TSRFSR 3)。以及有关优化 UE 旧功能的建议:照明和着色 以及 几何体
    其他有用的性能剖析工具旧版本的 Unreal Engine 中包含了一些现已弃用的剖析工具。本节将介绍这些工具,并重点介绍一些有用且相关的特性。
    进一步阅读在此处的 GPUOpen 上发现更多我们的 Unreal Engine 内容!

    在 Unreal Engine 中进行性能剖析

    降低剖析时的 CPU 开销

    在 UE 中进行剖析时的第一个问题是应该使用什么构建配置。在剖析 GPU 时,您希望 CPU 性能足够快,以便在剖析过程中不会碍事。当然,应该避免使用 Debug 构建进行剖析,因为引擎代码没有启用优化进行编译。有关此主题的详细讨论,请参阅 UE 构建配置文档

    请注意,Development 构建比 Test 或 Shipping 构建具有更高的 CPU 开销。尽管如此,剖析 Development 构建可能很方便,因为它能让您完全访问控制台命令配置界面(即 cvar),从而在尝试查找最佳配置更改时能够快速迭代。为了降低 Development 构建中的 CPU 开销,您应该关闭 CPU 端任何不必要的处理,并避免在编辑器中进行剖析。可以使用 -game 命令行参数使编辑器作为游戏运行。以下命令行展示了使用和禁用 Unreal Engine 不必要 CPU 工作的一个示例:

    终端窗口
    UEEditor.exe ShooterGame -game -nosound -noailogging -noverifygc

    考虑在剖析时使用 Test 构建

    Test 构建比 Development 构建的开销更低,同时仍然提供一些开发者功能。独立可执行文件的 Test 构建需要已烘焙的内容。如果您需要在剖析时进行迭代,但又希望获得 Test 构建的较低 CPU 开销,请考虑使用“即时烘焙”(COTF)。例如,使用 COTF Test 构建可以进行着色器迭代。

    另请注意,在某些旧版本的 Unreal Engine 中,您可能必须在 Build.h 中手动启用 STATS 宏以添加对 stat GPU 控制台命令的支持。此外,旧版本的 UE 可能要求您在 Build.h 中启用

    ALLOW_PROFILEGPU_IN_TEST 宏,以便 ProfileGPU 命令可用。有关 stat GPU 和 ProfileGPU 的更多详细信息将在 剖析工具 部分中提供。

    降低剖析结果中的噪声

    在尝试优化工作负载的执行时间时,我们需要能够可靠地测量特定工作负载花费的时间。这些测量结果应该尽可能少地产生噪声。否则,我们就无法判断它是因为我们的优化而运行得更快,还是因为某些随机数生成器决定生成更少的粒子(例如)。

    UE 具有一些内置功能可以帮助解决此问题。 -benchmark 命令行参数会导致 UE 自动更改某些设置,使其对剖析更友好。 -deterministic 参数会导致引擎使用固定的时间步长和固定的随机种子。然后,您可以使用 -fps 设置固定的时间步长,并使用 -benchmarkseconds 让引擎在固定数量的时间步长后自动关闭。

    以下是使用这些参数处理Infiltrator演示的 Test 构建的示例:

    终端窗口
    UEGame-Win64-Test.exe "..\\..\\..\InfiltratorDemo\InfiltratorDemo.uproject"
    -nosound -noailogging -noverifygc -novsync -benchmark
    -benchmarkseconds=211 fps=60 -deterministic

    在上述示例中,-benchmarkseconds 不是实际挂钟时间(除非演示的每一帧都以精确的 60 fps 运行)。而是运行

    211 x 60 = 12,660 帧,使用固定的 1/60 = 16.67 毫秒时间步长。这意味着,如果您设置了项目以便在启动时运行相机飞行,它将使用固定的时间步长和固定的随机种子进行飞行。然后,它将在固定数量的帧后自动关闭。这对于收集关卡的可重复平均帧时间数据可能很有用。

    另一种帮助降低剖析结果噪声的技术是固定时钟运行。大多数 GPU 都有一个默认的电源管理系统,当空闲时会切换到较低的时钟频率以节省电量。但这会以性能为代价换取较低的功耗,并可能在我们的基准测试中引入噪声,因为时钟在应用程序的不同运行之间可能不会以相同的方式缩放。您可以固定 GPU 上的时钟以减少这种差异。存在许多第三方工具,但 Radeon GPU Profiler 附带的 Radeon Developer PanelApplications 下有一个“Device Clocks”选项卡,在面板连接到应用程序后,可用于在 AMD RDNA™ GPU 上设置稳定的时钟,如下所示:

    回到减少 UE 中的可变性,您可能会发现某些内容不 遵循 -deterministic 命令行参数中的固定随机种子。Infiltrator 演示中的某些粒子就是这种情况。这些粒子在我们的基准测试中造成了明显的噪声。

    减少粒子噪声的解决方案是使随机数生成器使用固定种子。只需两步即可使粒子确定性:

    1. 右键单击粒子的发射器,然后单击“Browse to Asset”。

    2. 一旦在Content Browser中选择了发射器资源,请右键单击它并选择“Convert To Seeded”。

    就是这样!您也可以在Content Browser中选择所有发射器并一次性全部转换。完成此操作后,噪声将大大降低,并且应该非常容易地评估您的优化。

    注意: 如果您正在使用 Niagara 粒子,请在官方 UE 文档中查找“Emitter settings”下的“Deterministic Random Number Generation”。

    https://docs.unrealengine.com/en-US/emitter-settings-reference-for-niagara-effects-in-unreal-engine/

    从单一位置进行性能剖析

    一种进行性能剖析的方法是进入关卡中的同一位置。

    Player Start actor 可用于在启动时直接生成到特定位置。可以将其从编辑器拖入场景。

    如果您无法在编辑器模式下更改场景,或希望在游戏中进行传送,则可以使用UCheatManager BugIt工具。

    注意: BugIt 工具仅在非 shipping 构建中可用。

    使用 BugIt 进行传送

    • 首先打开控制台窗口。在编辑器中,可以通过Window->Developer Tools->Output Log访问。如果您在游戏中,请使用控制台命令 showlog .
    • 在控制台中键入 BugIt。输出字符串中的第一行应如下所示: BugItGo x y z a b c . 此 BugItGo 命令可以粘贴到控制台中,从任何位置传送到当前位置。

    沿固定摄像机飞行路径进行性能剖析

    固定摄像机飞行路径是创建确定性的、动态的场景的一种好方法,该场景能更好地代表您游戏的性能,同时又可重复且更有利于测试性能改进。要开始创建飞行路径,请在 UE 编辑器中打开您的游戏项目,在主编辑器窗口的顶部,选择 Cinematics->Add Level Sequence。系统会提示您为序列命名并将其保存到项目文件夹结构中的某个位置。这将打开 Sequencer 控件。第一步是移动当前视图到您希望飞行路径开始的位置,然后单击 Sequencer 控件中的 相机图标按钮,这将创建一个新相机并将其设置为当前相机剪辑。然后,通过单击 Sequencer 控件 UI 中各种相机设置旁边的“+”(加号)按钮来创建您的第一个关键帧。

    然后,通过将视图移动到新位置,然后将轨道时间移动到时间轴上所需的位置以存在关键帧,并单击 Transform “+”按钮将视图方向保存到关键帧,从而创建任意数量的其他关键帧位置。

    继续此操作,直到完成飞行序列。在序列化的任何时候,您都可以按空格键来播放关键帧序列作为动画。最后,您需要创建一个触发器 actor 来在运行游戏时启动序列器动画。这可以使用 UE 的蓝图脚本工具来完成,该工具超出了本指南的范围,但快速的互联网搜索很可能会显示大量教程视频,如果您不熟悉 UE 中的触发器和/或蓝图。

    考虑创建自己的测试场景

    优化效果需要进行大量实验,而每次迭代都需要时间。我们需要重建游戏、烘焙内容等。UE 的即时烘焙 (COTF) 等功能可以对此有所帮助。但将您正在优化的效果或技术隔离到一个小型应用程序中也很有用。

    要是我们能轻易生成这样的应用程序就好了!幸运的是,Unreal 提供了一个名为Migrate的功能。它会提取某个资产及其所有依赖项,并将其导入到任何其他项目中。在这种情况下,为了创建一个小型应用程序,我们将把该效果迁移到一个空项目中。

    有关迁移资产的官方文档:https://docs.unrealengine.com/en-US/migrating-assets-in-unreal-engine

    在进行性能剖析前的最后检查

    现在您的构建已准备好进行性能剖析,您应该对

    几件事进行健全性检查,然后再开始。首先,确保帧速率平滑已禁用。从 UE4.24 开始,它默认禁用,但最好再次检查。在编辑器中,您可以在Edit->Project Settings…->Engine ->General Settings->Framerate中进行检查,如下所示:

    或者,您可以确保 bSmoothFrameRateEngine\Config\BaseEngine.ini 和项目 DefaultEngine.ini 中出现的所有位置都设置为 false。您还可以将 bForceDisableFrameRateSmoothing=true 添加到项目 DefaultEngine.ini\[/Script/Engine.Engine\] 部分。

    接下来,关闭 VSync。一种方法是使用 -novsync 命令行参数。将其添加到我们之前的示例中会得到以下结果:

    终端窗口
    UEEditor.exe ShooterGame -game -nosound -noailogging -noverifygc -novsync

    最后,运行您的构建并在日志文件中验证您的分辨率。

    分辨率是 GPU 性能的一个非常重要的因素,值得验证它是否符合您的预期。打开您构建的日志文件,查找类似以下内容的行:

    LogRenderer: Reallocating scene render targets to support 2560x1440

    用于一致性能剖析的其他命令行参数

    参数描述
    -noailogging禁用 AI 日志记录
    -nogpucrashdebugging禁用 GPU 崩溃转储日志记录
    -nomcp禁用多人游戏。
    -noscreenmessages禁用屏幕上的所有调试文本消息。
    -noverifygc跳过垃圾回收器安全检查。
    -nothreadtimeout禁用对渲染线程锁定状态的检查。
    -unattended防止弹出对话框。

    性能剖析工具

    Unreal Engine 拥有多种外部和游戏内工具来衡量性能。Epic 提供了一个名为Unreal Insights的外部工具,可以在引擎的 Engine\Binaries\Win64 文件夹中找到。要使用它,请启动 UnrealInsights.exe,然后启动您的游戏。您的游戏很可能会自动连接并开始向 Unreal Insights 应用程序发送性能数据(如果是这样,您将在 Unreal Insight 应用程序窗口的跟踪列表中看到一个“Live”条目),但您可能需要通过从其控制台命令行运行此命令来启动您游戏的跟踪:

    Trace.Send 127.0.0.1

    一旦性能数据开始流动,您可以使用以下两个命令来开始和停止它:

    Trace.Pause

    Trace.Resume

    有关使用此工具衡量性能的完整详细信息,请参阅 Unreal Insights 文档

    Unreal Insights非常有用,因为它跨多个帧跟踪数千个性能指标,并以非常有用的交互式图形格式显示它们,但有时您希望在游戏本身中实时显示性能信息。幸运的是,UE 提供了几个 stat 控制台命令来实现这一点。一些最有用的包括:

    命令描述
    stat fps不显眼地显示每秒帧数 (FPS) 和每帧毫秒数。
    stat unit显示所有主要引擎线程的时间。这可能是最重要的命令,它可以让您知道您是受 CPU 还是 GPU 限制。
    stat gpu提供 GPU 性能的总体概述,包括帧时间、绘制调用计数和三角形计数。通过监控这些指标,可以识别潜在的瓶颈并评估整体 GPU 负载。您应该将 r.GPUStatsEnabled 设置为 1 以便此功能正常工作。
    stat scenerendering这与 stat gpu 类似,但它提供了对帧更高级别的细分,包括诸如 present 时间、网格绘制调用等。
    stat nanite显示与 Nanite 渲染、三角形计数和实例计数相关的统计信息。解释这些指标有助于了解 Nanite 虚拟化几何体的性能影响并识别潜在的优化机会。有关更详细的 Nanite 统计信息,请使用:nanitestats
    stat rhi显示内存计数器,有助于调试内存压力场景。

    有关所有 stat 命令的完整描述,请参阅 UE 的文档

    使用 RGP 进行性能剖析

    上面描述的工具对于量化性能和识别问题区域非常有用,但要真正分析和理解这些问题区域的作用以及它们为何花费如此长的时间,您应该使用 AMD 的 Radeon™ GPU Profiler (RGP)

    RGP 是一款突破性的低级优化工具,可提供有关 Radeon™ GPU 的详细信息。

    要使用 RGP 分析性能,您必须首先配置您的 UE 游戏以使用 D3D12 RHI 或 Vulkan RHI。本指南将在示例中使用 D3D12。您可以通过运行带有 -d3d12 命令行参数的 UE 可执行文件,或通过在编辑器中更改默认 RHI 来调用 D3D12 RHI:Edit->Project Settings…->Platforms->Windows->Default RHI to DirectX 12

    此外,最好通过在 ConsoleVariables.ini 中取消注释以下行来启用 UE 的 RGP 调试标记:

    D3D12.EmitRgpFrameMarkers=1

    这可确保任何用 SCOPED_DRAW_EVENT 宏括起来的 UE 代码在 RGP 捕获中显示为有用的标记。

    注意:如果您使用的是测试版构建,请在 Build.h 中设置 ALLOW_CHEAT_CVARS_IN_TEST,以便在测试版构建中使用 ConsoleVariables.ini,或者在项目的 DefaultEngine.ini 中添加 [ConsoleVariables] 部分。

    [ConsoleVariables]
    D3D12.EmitRgpFrameMarkers=1

    此外,为了获得最准确的性能计时,请将 r.ShowMaterialDrawEvents 设置为 0。您需要在游戏或项目运行起来之后进行此更改。这是因为虚幻引擎源代码中有一个启动挂钩,用于配置引擎以进行 GPU 捕获调试。将 r.ShowMaterialDrawEvents cvar 设置为 0 可以防止为各个材质绘制事件发出调试标记,这会给这些事件带来大量的 CPU 和 GPU 开销,从而可能导致 RGP 捕获中的计时结果不准确。同样,建议将 r.RHICmdBypass 设置为 0,并将 r.RHIThread.Enable 设置为 1,同样在运行时进行,因为这些 cvars 也会被 GPU 捕获调试启动挂钩覆盖,并可能对 RGP 性能计时产生不利影响。

    可以通过修改 UE 源代码来轻松消除在运行时设置这些变量的需要。在函数 FD3D12Device::SetupAfterDeviceCreation() 中,删除如下代码:

    // AMD RGP profiler
    if (GEmitRgpFrameMarkers && FD3D12DynamicRHI::GetD3DRHI()->GetAmdAgsContext())
    {
    // Running on AMD with RGP profiling enabled, so enable capturing mode
    bUnderGPUCapture = true;
    }

    这将阻止引擎在启动时覆盖这些设置。

    CPU 瓶颈还是 GPU 瓶颈?

    在开始 UE 性能分析时,了解目标平台上的主要性能瓶颈至关重要。根据瓶颈位于 CPU 还是 GPU,我们可能会在性能分析方向上采取不同的方法。

    使用 Radeon™ Developer Panel (RDP) 进行性能捕获后,这些详细信息可在 Radeon GPU Profiler (RGP) 的概览->帧摘要视图中找到。

    以下展示了一个极端的 CPU 瓶颈示例,该示例通过向 UE 添加 CPU 忙碌工作创建,随后是一个 GPU 瓶颈场景。

    一个很好的健全性测试,用于检查应用程序是否确实是 CPU 密集型的,就是扩展渲染分辨率。例如,如果通过将 r.ScreenPercentage 从 100 设置为 150 来增加 GPU 工作负载,并且 RGP 显示的结果与之前一样是 CPU 密集型的,那么这强烈表明该应用程序是彻底的 CPU 密集型的。

    一旦确定我们是 GPU 密集型还是 CPU 密集型,我们可能会决定进一步使用 RGP 进行诊断(如果是 GPU 密集型),或者切换到其他工具,如 AMD uProf(如果是 CPU 密集型)。如前所述,本指南的版本侧重于 GPU,因此我们将讨论如何确定 GPU 的时间花在哪里。

    RGP 和 UE 示例

    本节使用我们优化 Lumen 性能的案例研究之一,来演示如何使用 RGP 进行分析。此示例将帧时间减少了 0.3ms(在 Radeon 7900XTX 上以 4K 分辨率测量)。乍一看这可能不是很多,但如果您以 60fps 为目标,0.3ms 大约占您 60Hz 帧预算的 2%。

    使用 RDP 进行性能捕获后,这些详细信息可在 RGP 的事件->事件计时视图中找到。如果您发出了 RGP perf 标记,您可以通过搜索 SupportImportanceSampleBRDF 快速导航到正在调查的标记。

    我们可以看到 ExecuteIndirect() 调用耗时 0.8ms。我们可以做得更好!

    要检查在 GPU 上运行的 ExecuteIndirect 命令的详细信息,请右键单击该命令并选择在管道状态中查看。此视图显示 ExecuteIndirect 命令被转换为计算 Dispatch 命令。

    我们可以看到 VGPR 和 SGPR 的使用信息,以及许多有用的 wave 和线程执行统计数据。管道状态的信息选项卡显示,由于其 VGPR 使用量,我们的计算着色器最多只能运行 7 个 wavefront。在 RDNA GPU 及以上版本中,这种 GPU 工作负载将在“部分 wave”中执行,这意味着 GPU 未充分利用。

    Wavefront Occupancy 选项卡将 SupportImportanceSampleBRDF 计算着色器显示为一系列黄色条形。通过双击下方 wave 图的事件时间轴中的事件,我们可以高亮显示这些条形。

    我们可以通过选择指令计时选项卡进一步深入了解此计算着色器的性能。此显示提供了在 GPU 硬件上执行的确切着色器指令以及每条指令相对于其他指令占用的时钟百分比,这对于识别瓶颈非常有用。

    ISA 视图对于其他优化(如标量化)也很有用,尽管此处未涵盖(有关该主题的更多信息,请参阅 GPU 标量化入门)。

    接下来,我们可以通过命令控制台启用我们的配置更改,以查看性能影响。

    r.Lumen.ScreenProbeGather.StochasticInterpolation 1

    StochasticInterpolation cvar 参数会导致 LumenScreenProbeGather/SupportImportanceSampleBRDF 着色器从当前像素的最近四个屏幕探针中随机选择一个,而将其设置为 0 则从最近的四个探针计算双线性插值值。您可能会认为这会极大地影响 Lumen 照明的质量,但在实践中通常并非如此。

    使用 RDP 进行另一次性能捕获并返回 RGP 的事件计时视图后。

    现在 dispatch 耗时 0.55ms - 性能提升了 30%!性能提升的原因是由于 VGPR 需求降低导致占用率提高,以及由于读取屏幕探针纹理次数减少导致纹理带宽需求降低,从而提高了硬件利用率,我们可以在指令计时选项卡的最右侧选项卡中看到这一点。

    之前之后
    BeforeAfter

    此外,我们可以在Wavefront OccupancyPipeline State 选项卡中看到,我们的计算着色器在大部分执行过程中保持了最大 12 个 wavefront 的可能占用率。

    在 Unreal Engine 中进行优化

    本节提供了关于优化 UE 中的内容和着色器的一般性建议。尤其值得关注的是虚幻引擎 5 的激动人心且具有开创性的新功能,包括 Nanite 和 Lumen,以及虚拟阴影贴图和 UE5 可用的几种 upscaling 技术,包括 Temporal Super Resolution 和 FSR 3。AMD 的 Dev Tech 团队对这些新功能进行了广泛的测试,以了解如何在 AMD RDNA 3 GPU 上获得最佳性能。

    优化 Nanite

    Nanite 是虚幻引擎强大的新几何引擎,可提供像素级别的细节和精细、全自动的细节级别控制。这是通过使用计算着色器而不是硬件的固定功能能力来实现对小图元的剔除和光栅化来实现的。

    在 AMD 硬件上对 Nanite 的测试表明,它们相辅相成。我们建议在 RDNA 3 GPU 上提高 Nanite 三角形密度。在创作 Nanite 资源时,可以通过位置精度保留三角形百分比参数来控制其密度。

    但是,您必须平衡更高的三角形密度与材质密度。大量带有很少材质的小型 Nanite 三角形比带有许多不同材质的大量小型 Nanite 三角形性能更好。Nanite 可视化->材质 IDNanite 可视化->材质复杂度视图模式提供了一种便捷的方法来识别项目中的此类性能问题。要启用Nanite 材质复杂度视图模式,您必须将 r.Nanite.Visualize.Advanced 设置为 1。

    另一个需要考虑的因素是硬件光栅化图元与软件光栅化图元的比例。Nanite 控制此比例的启发式方法是 r.Nanite.MinPixelsPerEdgeHW cvar。在 7900XTX 上,我们发现值为 32 效果很好,但理想情况下,您可以根据平台或作为性能质量设置来调整此参数。您可以使用Nanite 可视化->光栅模式视图模式来检查 MinPixelsPerEdgeHW cvar 如何改变 HW 与 SW 光栅化图元的比例。要启用 Nanite 光栅模式视图模式,您必须将 r.Nanite.Visualize.Advanced 设置为 1。

    有关优化 Nanite 内容的更多详细信息,请参阅官方文档

    优化 Lumen

    虚幻引擎 5 还引入了一个名为 Lumen 的新全局照明和反射系统。Lumen 功能强大且高度可配置。我们进行了大量工作来确定平衡视觉保真度和性能的最佳设置。

    首先,我们强烈建议使用软件光线追踪选项,将 r.Lumen.HardwareRayTracing 设置为 0,或者取消勾选编辑->项目设置…->引擎->渲染->Lumen->“可用时使用硬件光线追踪”。硬件光线追踪与软件光线追踪之间的性能差异很大(我们在 7900XTX 上测量到高达 1.2ms 的差异),但在大多数情况下,视觉质量差异很小。Lumen 软件光线追踪会追踪有符号距离场的射线。您可以通过修改距离场体素密度设置来进一步控制全局追踪射线的性能,并通过修改网格的距离场分辨率(较低的值性能更好)和/或双面距离场生成设置(关闭性能更好)来控制局部追踪射线的性能。

    另一个有用的配置参数,可以在几乎不损失感知质量的情况下提高性能,是将 r.Lumen.ScreenProbeGather.StochasticInterpolation 设置为 1,我们的测试表明这可以在 Lumen ScreenProbeGather 通道(即全局照明)中获得高达 30% 的性能提升。将此 cvar 设置为 1 会使着色器从当前像素的最近四个屏幕探针中随机选择一个,而不是在最近的四个探针之间进行双线性插值。理论上这会降低照明质量,但实际上我们发现大多数游戏中视觉差异是不可察觉的。

    以下是一些您应该测试的其他 Lumen cvar 配置参数,看看是否可以在最大程度地减少视觉质量损失的同时获得一些性能提升。

    Cvar 名称描述
    r.Lumen.ScreenProbeGather.SpatialFilterNumPasses将此值从默认的 3 降低到 2 或 1,可以在不明显降低质量的情况下节省时间。它还可以与 StochasticInterpolation=1(见上文)结合使用,以获得更高的性能提升。
    r.Lumen.ScreenProbeGather.IntegrationTileClassification在某些情况下,将其设置为 0 会在 LumenScreenProbeGather 通道中提高性能,而不会有任何视觉质量损失。但是,性能影响在所有测试的游戏中并不一致,因此请务必进行测试。
    r.Lumen.Reflections.RadianceCache设置为 1 可通过重用为漫反射全局照明追踪的射线来提高性能,但对反射质量有一定可见影响。

    此外,还可以查看Epic 的 Lumen 性能指南以获取更多优化思路。

    优化虚拟阴影贴图

    虚幻引擎 5 还引入了一种新的阴影贴图技术,称为虚拟阴影贴图 (VSM)。逼真的阴影是实现游戏真实感最有效的方法之一,但它也可能带来很高的性能成本。一个隐藏的 gem 配置,用于获得最佳性能是 r.Shadow.Virtual.SMRT.SamplesPerRayLocal。此 cvar 控制来自局部光源(即非定向光源)的阴影的柔和边缘的外观。尝试将此值从默认的 8 降低。任何两个相邻值之间的视觉差异,例如 7 和 8,几乎无法察觉。然而,性能优势将是显而易见的,特别是在有很多阴影投射灯光的场景中。相应的 r.Shadow.Virtual.SMRT.SamplesPerRayDirectional 对视觉保真度的影响相似,但仅能提高定向光的性能(例如太阳、月亮等),而定向光在大多数游戏关卡中通常不那么普遍。因此,修改此参数对性能的影响较小。VSM 有许多其他配置参数,请务必查看UE VSM 文档以获取完整详细信息。

    优化 upscale

    如果您的游戏将 UE 的功能发挥到极致,那么使用 upscale 解决方案来进行性能和抗锯齿至关重要。UE 提供了多种选项来进行渲染帧的抗锯齿和 upscale。UE 版本 5 引入了 Temporal Super Resolution (TSR) 算法。UE 版本 4 提供了 TemporalAA Upscaling (TAAU) 解决方案。当然,AMD 的 FSR 插件也是不错的选择(如果我们自己不说的话😊)。

    UE5 Temporal Super Resolution

    UE5 的 Temporal Super Resolution (TSR) 功能增加了高质量的 super resolution upscale,这可以为您的整个帧工作负载带来性能提升,但如果部署不当,TSR 着色器本身可能会成为一个巨大的时间消耗者。该算法不仅更复杂,而且为了获得高质量的结果,必须跨多个帧存在并跟踪运动向量。此外,要小心将抗锯齿质量设置为高或史诗级,因为这可能会使您的游戏超出目标帧率。

    将 TSR 的 upscale 与将 r.TSR.AsyncCompute 设置为 1 以异步执行着色器结合起来,有助于应对 TSR 的高性能影响。

    r.TSR.History.ScreenPercentage 是 4K 性能的重要考虑因素。它控制 TSR 历史记录的分辨率,并通过 UE5 的抗锯齿可伸缩性设置进行控制。在抗锯齿质量 0-2(低、中、高)下,此 cvar 设置为 100,这意味着 TSR 的历史记录以输出分辨率存储。在抗锯齿质量 3-4(史诗级、电影级)下,此 cvar 设置为 200,这意味着 TSR 的历史记录将以 2 倍输出分辨率存储。这可能会导致 4K 性能下降,因为即使从较低分辨率 upscale,历史记录也将以 8K 分辨率存储。我们观察到此更改将总帧时间减少了高达 1.2ms(在 Radeon 7900XTX 上以 4K 分辨率测量)。

    AA 可伸缩性设置可以在 Engine\Config\BaseScalability.ini 文件中更新。我们建议更新“史诗级”设置(“AntiAliasingQuality@3”)以将 r.TSR.History.ScreenPercentage 降低到 100。

    r.TSR.History.ScreenPercentage=200
    r.TSR.History.ScreenPercentage=100

    最后,最好将 TSR 用于 upscale 和抗锯齿,而不是仅用于抗锯齿。UE4 TAAU 和 FSR 3 是仅用于抗锯齿的更好选项。

    UE4 TemporalAA upscale

    如果 TSR 对您的游戏来说太昂贵,您可以尝试 UE4 Temporal Anti-Aliasing Upscaler (TAAU),方法是将 cvar r.AntiAliasingMethod 设置为 2,并将 r.TemporalAA.Upsampling 设置为 1。此着色器无法产生与 TSR 相同的输出质量。为了获得更好的质量结果和更低的影响,最好的选择是 FSR 3。

    FSR 3

    AMD FidelityFX Super Resolution (FSR) 3 产生的时间抗锯齿和 super resolution upscale 输出与 TSR 相当,但性能更好。FSR 3 超越了 TSR,提供了帧生成功能,以提高 FPS 并改善游戏的动画流畅度。FSR 3 通过添加两项新技术来实现这一点——帧插值和增强的 AMD Fluid Motion Frames 光流。在此处阅读有关 FSR 3 技术细节的更多信息:/fsr3-in-games-technical-details/

    FSR 2

    FSR 3 的时间抗锯齿和 upscale 技术直接来自 FSR 2。如果您使用 UE4 或对 FSR 3 的帧生成功能不感兴趣,那么 FSR 2 时间 upscale 可以满足您的需求。此外,请务必查看 FSR 2 的最新更新以及我们关于最大化您的FSR 2 性能和质量的博客系列。FSR 2 可作为UE4 和 U5 的插件

    FSR 1

    FSR 1 是我们的空间抗锯齿和 upscale 解决方案。它是所有选项中最轻量级、最快的,但仍然产生令人印象深刻的 upscale 结果。FSR 1 的基于空间的算法在性能上比时间性的方法有优势,因为与时间抗锯齿解决方案不同,几乎所有的后期处理操作都可以在 FSR 1 upscale 之前以降低的分辨率渲染。此外,FSR 1 需要更少的输入数据,例如运动向量,从而减轻了游戏内存的负担,并且更容易集成。如果上述时间性 upscale 解决方案对您的游戏来说负担过重,那么它绝对是一个不错的 upscale 插件选择。有关完整详细信息,请查看FSR 1 文档

    优化照明和阴影

    UE 编辑器有许多可视化工具可用于调试。其中最值得注意的是优化视图模式

    下面介绍了一些更有用的视图模式,有关详细信息,请参阅官方文档

    • 如果您的场景包含多个具有大源半径的光源,请检查光照复杂度视图模式以优化重叠的光源。影响表面的光越多,渲染成本越高。

    • 对于具有静态光照的场景,光照贴图密度视图模式显示了为 Actor 烘焙光照时使用的 texel 分辨率。如果场景中有一个小对象,在屏幕上占据的像素区域很小,显示为红色(高密度),则可以进行优化。为了提高性能,尝试选择一个 Actor,并将其光照->覆盖光照贴图分辨率更改为较低的值。实际性能成本在于光照贴图和/或阴影贴图(取决于使用的光类型)的内存使用。

    • 静态阴影贴图每个 texel 只能有 4 个贡献光。任何过度贡献区域的额外静态光都可以通过静态光重叠进行可视化。UE 通过将过量的静态光更改为可移动的来强制执行此操作,用红叉标记它们,并在静态光重叠视图模式中将重叠可视化为红色区域。由于可移动光非常昂贵,我们可以通过减小半径或关闭静态阴影(通过选择灯光并修改其灯光/投射阴影参数)来优化过量的灯光。

    • 着色器复杂度视图模式使用每像素执行的着色器指令数的静态分析来确定像素成本。作为补充,我们建议在 RGP 中使用事件->Wavefront 占用率和概览->最昂贵事件视图来总结您的帧时间花费在哪里。

    • 具有大量半透明、树叶或粒子效果的场景将在四重叠加视图模式中以高值渲染像素。如果您的应用程序大部分时间内的平均叠加(由 OD 在颜色渐变中标记)保持在高值,则可能需要进一步优化。

    优化几何体

    Nanite 不支持您可能想在游戏中使用的所有类型的几何网格,因此仍然需要经典的三角形网格。在处理非 Nanite 网格时,牢记这些网格优化技术很重要。首先,避免过度细分几何体。使用 LOD 来防止像素和亚像素大小的三角形,因为这些小三角形在 AMD GPU 上性能非常差。有关 LOD 的详细信息,请参阅官方文档:https://docs.unrealengine.com/en-US/Engine/Content/Types/StaticMeshes/HowTo/LODs/index.html

    可以通过编辑器访问的线框视图模式是查看场景中对象几何复杂度的绝佳方式。请注意,重度半透明会减慢线框视图模式的速度,使其看起来更混乱且帮助性更小。RenderDoc 和 PIX 也提供线框视图。

    UE 计算场景可见性以剔除最终帧图像中不会出现的物体。但是,如果剔除后的场景仍然包含数千个对象,那么绘制调用可能会成为性能问题。即使我们渲染低多边形计数网格,如果绘制调用太多,由于设置每个绘制调用到 GPU 的 CPU 端成本,它也会成为主要的性能瓶颈。UE 和 GPU 驱动程序都会为每个绘制调用执行工作。

    stat scenerendering 命令可用于检查场景的绘制调用计数。

    然而,减少绘制调用是一个权衡过程。如果您决定通过使用较少的较大网格而不是许多较小的网格来减少绘制调用,那么您将失去从较小模型中获得的剔除粒度。

    我们建议使用至少 4.22 版本的虚幻引擎,以获得带有自动实例化的网格绘制重构。有关详细信息,请参阅 Epic 在 GDC 2019 上的演讲:为虚幻引擎 4.22 重构网格绘制管线 | GDC 2019 | Unreal Engine

    GDC 2019 - Refactoring the Mesh Drawing Pipeline for Unreal Engine 4.22

    此外,UE 的层次细节级别 (HLOD) 系统可以在远处用单个网格替换多个静态网格,以帮助减少绘制调用。有关详细信息,请参阅官方文档:https://docs.unrealengine.com/en-US/Engine/HLOD/index.html

    优化 CPU 核心使用

    我们不能忘记 CPU。UE 的模拟和渲染任务在 CPU 核心使用方面可能有点贪婪。无限制地使用 CPU 核心会导致上下文切换或任务窃取。因此,通过使用 -corelimit=# 根据游戏的计算需求限制核心数量将提高整体性能。

    其他有用的性能剖析工具

    本节介绍了针对旧版虚幻引擎的其他内置 UE 分析工具。

    UE4 FrontEnd

    控制台命令:stat startfilestat stopfile 会将开始/停止期间的所有实时统计数据转储到 .ue4stats 文件,该文件可以在 Unreal Frontend 中打开。

    UE4 GPU Visualizer

    ProfileGPU 命令允许您在 GPU Visualizer 中展开一帧的 GPU 工作,这对于需要引擎详细信息的场景非常有用。

    一些例子

    • stat gpu 中,我们看到半透明基础通道慢 1ms。在 GPU Visualizer 中,我们找到一个耗时近 1ms 的半透明网格。我们可以选择删除或优化此网格,以平衡不透明和半透明绘制所花费的时间。

    • stat gpu 中,我们看到阴影深度灯光/阴影灯光都占用了帧时间。在 GPU Visualizer 中,我们找到了一个昂贵的动态光源的名称。我们可以选择将其更改为静态光源。

    对于 GUI 版本,在运行 ProfileGPU 之前将 r.ProfileGPU.ShowUI 设置为 1。

    有关详细信息,请参阅官方 ProfileGPU 文档

    我们强烈建议将 RGP 作为 RDNA GPU 的主要分析工具,而不是 GPU Visualizer。RGP 可以具有与上述示例相同的处理流程。通过 RGP,您可以获得深入的 GPU 性能捕获,并具有更准确的计时和低级 ISA 分析。

    CSV Profiler 和 FPS Chart

    在 Unreal Insights 之前,用于长时间基准测试的最佳工具是 CSV Profiler,它可以在指定期间获取 stat unit 时间。结果会放入 .csv 文件,然后 CsvToSvg 工具可以将此输出转换为交互式可缩放矢量图形 (SVG)。

    用于启动/停止 CSV Profiler 和/或 FPS Chart 的控制台命令

    • csvprofile \[start/stop\]

    • StartFPSChart/StopFPSChart

    有关这些已弃用工具的官方文档

    进一步阅读

    您可以在以下链接找到我们的 FidelityFX Super Resolution Unreal Engine 插件:

    FSR 3 | FSR 2 |FSR 1

    不要错过我们关于FSR 2 相关补丁,以进一步提高性能。

    正在寻找更多方法来提高虚幻引擎的性能?或者您想添加新功能,例如我们的FidelityFX 效果,或者我们的高级媒体框架功能?

    我们还提供各种虚幻引擎补丁供您尝试。

    相关新闻和技术文章

    相关视频

    © . This site is unofficial and not affiliated with AMD.