渲染依赖图(4/4)

调试和验证

渲染图系统通过引入延迟模式数据结构增加了复杂性。当执行期间发生故障时,可能很难找到与其执行Lambda关联的通道设置位置。当启用RHI线程时,情况会更加复杂,因为正在执行的RHI命令现在从其设置位置移开两度。

例如,如果在平台RHI内设置RHI着色器参数时发生崩溃,则无法仅从调用堆栈位置推断故障发生的位置。RDG和RHI都有工具来帮助解决这些问题。RDG 即时模式 是一种调试功能,它绕过图的编译,有利于直接在 AddPass 调用中执行通道。

使用调试或开发版本时启用以下方法。

方法 变量
控制台变量 r.RDG.ImmediateMode
命令行参数 -rdgimmediate

在另一个示例中,如果由于通道参数结构体中的空指针导致RDG通道Lambda内发生崩溃,则调试器会在Lambda内部中断,此时检查任何设置代码为时已晚(其中真正的问题被引入)。启用即时模式后,Lambda会在设置时间轴上执行,从而可以直接检查设置代码。

使用控制台命令 r.RHICmdBypass 禁用并行渲染和软件命令列表。结合RDG即时模式,它消除了所有延迟机制,提供了一个用于调试的调用堆栈。

还有其他一些控制台变量来控制RHI线程行为,可参考并行渲染概述文档。

在即时模式下,所有图优化都被禁用,包括临时分配、图剔除、渲染通道合并等。这将引入它们被禁用的副作用。

此外,如果出现问题,请使用以下控制台变量禁用RDG中的各个功能,而无需调用即时模式将其排除。

变量 描述
r.RDG.CullPasses 禁用以排除被剔除的通道。
r.RDG.MergeRenderPasses 禁用以要求每个RDG栅格通道具有唯一的渲染通道。
r.RDG.ParallelExecute 禁用以在渲染线程上串行运行所有通道。
r.RDG.TransientAllocator 禁用以回退到资源池。

验证层

RDG包含一个验证层,在使用调试或开发构建时默认启用。如果RDG使用不正确,该层会尽早发出致命检查,带有明确标记的资源/通道名称。它增加了额外的CPU开销,并会在测试和交付版本中编译出来。

资源转换调试

RHI中的资源转换API为每个子资源分配一个 ERHIAccess 和 ERHIPipeline 掩码。RDG负责在整个图中的状态之间转换各个子资源,假设资源使用RDG通道参数正确声明。当资源转换不正确时,RHI验证会记录日志,但可能很难调试在RDG中发生的转换,因为调用堆栈位置看起来总是相同的。

RDG本身已经过严格测试,以确保生成正确的转换。但是,如果需要,可以将RDG转换日志与RHI转换日志混合以发现不一致之处。

RDG转换日志:

  • 使用-rdgtransitionlog或r.rdg.transitionlog X(其中X是要记录的帧数)记录RDG中发生的所有转换。
  • 使用 r.RDG.Debug.ResourceFilter [ResourceName] 按资源名称过滤日志。
  • 使用 r.RDG.Debug.PassFilter PassName按通道名称过滤日志。

RHI转换日志:

使用 -rhivalidation 和 -rhivalidationlog=ResourceName 记录特定资源。

默认情况下,RDG打印来自 渲染线程 的转换,而RHI打印来自 RHI线程 的转换日志。要使它们对齐,你必须指定 -norhithread -forcerhibypass 或 -onethread。然而,禁用RHI线程会掩盖某些跨管线转换错误,但在大多数情况下,该问题仍会重现。

例如,要记录 SceneDepthZ 的所有RDG和RHI活动,请使用命令行参数:

-rhivalidation -rhivalidationlog=SceneDepthZ -rdgtransitionlog -rdgdebugresourcefilter=SceneDepthZ -onethread

可视化纹理

在开发版本中,RDG发布了所有纹理UAV或RTV写入 vis 命令。使用此命令在屏幕上可视化资源。在命令行中键入'vis'查看可用资源列表和命令格式。

临时分配器调试

临时分配器引入潜在瑕疵来源。使用 r.RDG.TransientAllocator 启用或禁用系统。

如果禁用系统消除了瑕疵,请考虑以下附加测试:

  • 使用 .RDG.ClobberResources 将所有资源强制初始化为已知值。如果这在没有启用临时分配器的情况下产生类似瑕疵,那么可能的解释是资源在被读取之前没有正确初始化。
  • 使用 r.RDG.Debug.ExtendResourceLifetimes 禁用图中的所有别名。这对于排除缺少别名屏障或不正确的资源生命周期很有用。
  • 使用 r.RDG.Debug.DisableTransientResources 从临时分配器中禁用资源。

对于上述任一命令,使用 r.RDG.Debug.ResourceFilter 过滤受影响的资源。这有助于缩小有问题的资源范围。

RDG Insights插件

作为Unreal Insights工具的扩展,渲染依赖图有自己的插件,称为 RDG Insights,用于RDG图结构的实时可视化。捕获追踪被并在 Timing Insights 视图中与其他CPU轨道一起显示为轨道。

转到主菜单并选择 编辑(Edit)> 插件(Plugins)> Insights,启用 RDG Insights 插件。

RDG Insights Timeline Views RDG Insights插件可用于查看图的属性:

  • 资源生命周期、通道关联和资源池分配重叠
  • 异步计算栅栏和重叠
  • 图剔除和渲染通道合并
  • 并行执行通道范围
  • 临时内存布局

RDG Insights插件也可以用作调试和诊断工具来回答以下问题:

  • 为什么异步计算通道不与图通道重叠?
  • 跨框架如何使用资源?
  • 资源分配是否与其他资源重叠?
  • 后处理使用哪些资源?
  • 哪些通道被剔除?

捕获追踪

捕获追踪只需要在Unreal Insights中启用RDG通道。启动客户端应用程序时,指定 -trace=rdg,defaults 参数即可。

如果连接到Unreal Insights中的实时追踪(Live Trace),启用RDG通道即可。

RDG追踪会生成大量数据。

参考幻灯片

有关该工具的更深入演练,请参阅以下幻灯片。