渲染依赖图(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.PassFilterPassName按通道名称过滤日志。
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插件可用于查看图的属性:
- 资源生命周期、通道关联和资源池分配重叠
- 异步计算栅栏和重叠
- 图剔除和渲染通道合并
- 并行执行通道范围
- 临时内存布局
RDG Insights插件也可以用作调试和诊断工具来回答以下问题:
- 为什么异步计算通道不与图通道重叠?
- 跨框架如何使用资源?
- 资源分配是否与其他资源重叠?
- 后处理使用哪些资源?
- 哪些通道被剔除?
捕获追踪
捕获追踪只需要在Unreal Insights中启用RDG通道。启动客户端应用程序时,指定 -trace=rdg,defaults 参数即可。
如果连接到Unreal Insights中的实时追踪(Live Trace),启用RDG通道即可。
RDG追踪会生成大量数据。
参考幻灯片
有关该工具的更深入演练,请参阅以下幻灯片。
