第四章:帧捕获进阶配置

本章覆盖 RenderDoc 帧捕获的进阶配置能力,包括 Capture Options 各参数含义、远程 Replay 服务器的搭建与使用、回放控制选项、为 Capture 添加注解标记,以及调用栈捕获的配置与查看。


Capture Options 各参数详解

在 Launch Application 对话框中,Capture Options 区域提供了一系列控制采集行为的参数。大多数场景下默认值即可正常使用,但了解每个参数有助于在特殊场景下调整采集策略。

Allow Fullscreen

允许被采集应用以全屏模式运行。默认开启。如果关闭该选项,RenderDoc 会强制应用以窗口模式运行,便于在采集时操作 UI。

Allow VSync

允许被采集应用启用垂直同步(VSync)。默认开启。如果关闭,RenderDoc 会禁用 VSync,使帧率不受刷新率约束,这在测量性能时更准确。

Debugger Delay

启动后等待调试器附加的延迟时间(秒)。默认为 0,即不等待。设置大于 0 的值时,程序启动后会暂停指定秒数,留给开发者时间将调试器附加到目标进程,便于在程序初始化阶段打断点。

Collect Callstacks

采集每次 API 调用时的调用栈信息,并将其序列化到 .rdc 文件中。默认关闭。开启后可在 API Inspector 中查看每个 draw call 或 API 调用的代码调用路径,但会带来额外的采集开销和内存占用。

配合 Only action stacks 子选项使用时,可以只在 action 类调用(如 Draw、Dispatch)时采集调用栈,从而在保留关键信息的同时降低开销。

Capture Child Processes

采集目标程序启动的子进程。默认关闭。开启后 RenderDoc 的 hook 会传递给子进程,适合用于采集通过 launcher 间接启动的渲染进程。

Ref all Resources

强制 RenderDoc 引用并序列化帧中出现的所有资源,即使某些资源在当前帧并未被显式访问。默认关闭。开启后 .rdc 文件体积会增大,但可以确保 Replay 时所有资源都可见。

Soft Mem Limit

采集时的软性内存限制(单位:MB)。RenderDoc 会尝试将采集的内存占用控制在该阈值以内。达到限制后,RenderDoc 不会强制停止采集,而是尽量减少保存的数据量。设置为 0 表示不限制。


保存与加载 Capture 配置(.cap 文件)

在开发迭代中,采集参数通常固定不变。RenderDoc 支持将当前的所有采集配置(可执行文件路径、工作目录、命令行参数及 Options)保存为 .cap 文件。

  • 在 Capture 对话框中点击 Save 保存配置文件。
  • 在设置了文件关联的系统上,直接双击 .cap 文件即可打开 RenderDoc 并加载该配置。
  • 勾选 Auto start 后保存,再次打开该 .cap 文件时会自动启动目标程序,实现一键采集。

注入已运行进程(Inject to Process)

RenderDoc 可以注入一个已经在运行但尚未初始化图形 API 的进程。

注意:必须在目标进程初始化图形 API 之前完成注入,否则 RenderDoc 无法正常 hook。注入功能默认未启用,需要在 Settings 中手动开启,且仅作为最后手段使用——优先使用 Launch Application 方式更加可靠。

操作路径:File Inject to Process,Capture 对话框切换为进程列表视图,选择目标进程后注入。


远程 Replay 服务器配置与使用

RenderDoc 支持跨网络的采集与回放,核心概念是 Replay Context(回放上下文)

默认状态下处于本地回放上下文,所有操作(采集、回放)均在本机完成。切换到远程上下文后,程序在远端机器上运行,采集与回放也在远端执行,UI 保持在本机运行。这与 Android 采集时的工作机制相同。

配置远程主机

打开 Tools Manage Remote Servers,在此管理远程主机。

  1. 在 hostname 输入框中填入目标主机的主机名或 IP 地址,点击 Add
  2. RenderDoc 立即发起网络探测,检查远端 Remote Server 是否在线。
  3. 支持在同一主机上运行多个 Remote Server,通过 hostname:端口号 的形式区分,例如 192.168.1.10:12345

配置自动启动命令(Run Command)

在 Remote Host 配置中可以填写一条在本机执行的命令,该命令负责远程启动目标主机上的 Remote Server。配置后,RenderDoc 在需要连接时会自动执行该命令,无需手动干预。

Remote Server 的启动命令为:

renderdoccmd remoteserver

使用 -d 参数可以让服务器在后台运行(daemon 模式):

renderdoccmd remoteserver -d

在 Linux 环境下的典型 Run Command 配置示例(使用 plink.exe + 免密 key 认证):

plink.exe user@host DISPLAY=:0.0 renderdoccmd remoteserver -d

提示:在 Linux 上建议在 Run Command 中同时配置 DISPLAY 环境变量,否则每次采集时都需要单独设置。

切换回放上下文

在 UI 底部状态栏的左侧可以切换 Replay Context。下拉列表会显示当前已配置且 Remote Server 在线的主机。切换前需确保没有已打开的 Capture。

选中远程主机后,RenderDoc 尝试连接。如果连接失败且配置了 Run Command,则自动执行该命令启动 Remote Server。

远程上下文中的工作方式

远程上下文下的操作体验与本地几乎一致,区别如下:

  • 文件浏览器:浏览的是远端文件系统,RenderDoc 使用自定义对话框展示远端目录内容。
  • 环境变量:远端进程继承 Remote Server 的环境,不继承本机环境。
  • Capture 文件存储:默认保留在远端,只有显式 Save 到本地路径时才会复制到本机。
  • 跨平台 Replay 提示:打开与当前系统平台差异显著的 Capture 文件时(如在 Windows 上打开 Linux 64-bit 的 Capture),UI 会提示是否切换到对应远端上下文进行回放。

配置 Remote Server 的访问控制

Remote Server 可通过 ~/.renderdoc/remoteserver.conf(Linux)或 %APPDATA%/renderdoc/remoteserver.conf(Windows)进行访问控制配置。

IP 白名单(允许指定 IP 段连接):

whitelist 192.168.0.0/16

若未配置任何白名单,默认允许所有私有 IP 段(10.0.0.0/24192.168.0.0/16172.16.0.0/12)连接。

禁止执行命令(只读模式):

noexec

配置 noexec 后,Remote Server 拒绝执行任何命令。此时需要通过其他方式手动启动 RenderDoc-hooked 的目标程序。

配置文件支持空行和以 # 开头的注释行。


控制 Replay(回放控制选项)

RenderDoc 默认的回放策略对大多数场景已足够,但也提供了若干精细控制选项。

使用非默认选项打开 Capture

通过 File Open Capture with Options 可以在加载 Capture 时指定自定义的回放选项。该对话框会自动填充最近使用的文件路径,并提供以下配置项。

Use API Validation on Replay

  • 默认值:Disabled

通常 RenderDoc 在采集时启用 API Validation,并将校验消息保存到 .rdc 文件中——这是获取 API 校验信息最可靠的方式。

若当时未启用 API Validation,可在此选项开启,Replay 阶段将实时收集 API 校验消息,结果在 Debug Messages 窗口中查看。

注意:Replay 阶段的分析工作比采集阶段更重,可能产生不同甚至误报的校验消息。最佳实践是在不使用 RenderDoc 的情况下直接对程序启用 API Validation。

GPU Selection Override

  • 默认值:Default GPU selection

默认情况下 RenderDoc 会尝试选择与采集时最接近的 GPU 进行 Replay。此选项允许手动指定使用系统中的某块具体 GPU(及对应 API),适用于需要在不同硬件上验证兼容性的场景。

  • 如果指定的 GPU 对该 Capture 不可用,回退到默认选择算法。
  • 如果指定的 GPU 可用但无法打开 Capture,Replay 直接失败,不进行回退。

Replay Optimisation Level

  • 默认值:Balanced

RenderDoc 的 Replay 内部在正确性与性能之间有多种权衡,此选项控制优化程度:

级别说明
No Optimisation禁用所有优化,用于隔离 RenderDoc 自身的 bug
Conservative开启安全优化,用户不可感知
Balanced开启更多优化,对最终帧结果无影响(例如清除无法被读取的 Render Target,而不是从前帧恢复其内容)
Fastest最激进的优化,中间状态可能出现”不可能”的数据(例如前述情形不清除 Render Target,导致后续帧数据反向泄漏),但最终帧结果仍然正确

并非所有 API 都能达到同等的优化程度,部分 API 下此选项效果有限。

修改全局默认选项

Settings Replay 中可以修改上述选项的全局默认值,作用于所有未指定特定回放选项打开的 Capture。


为 Capture 添加注解标记(API Annotations)

RenderDoc 支持两种 Capture 注解方式:应用程序在运行时通过图形 API 写入的标记,以及在 UI 分析阶段手动添加的标记。所有 UI 侧的修改均可通过 Ctrl-SFile Save 保存到 .rdc 文件中。

Marker Regions(API 侧标注分组)

可在应用代码中调用图形 API 提供的标注接口,将一段 GPU 命令标注为具名区域,支持嵌套层级。这些标注区域及其颜色会显示在 Event Browser 中。

D3D11(使用 D3DPERFID3DUserDefinedAnnotation):

D3DPERF_BeginEvent(0xff00ff00, L"Sub section");
// GPU commands
D3DPERF_EndEvent();
 
// 也可使用较新的接口
ID3DUserDefinedAnnotation *annot;
immediateContext->QueryInterface(__uuidof(ID3DUserDefinedAnnotation), (void **)&annot);
annot->BeginEvent(L"Sub section 2");
annot->EndEvent();

D3D12(在 Command List 或 Queue 上调用):

// 第一个参数 1 表示 ANSI 字符串,0 表示 wchar 字符串
list->BeginEvent(1, "Begin Section", sizeof("Begin Section"));
list->EndEvent();

OpenGL(使用 KHR_debug 扩展):

glPushDebugGroupKHR(GL_DEBUG_SOURCE_APPLICATION, 0, -1, "Begin Section");
// GPU commands
glPopDebugGroupKHR();

Vulkan(使用 VK_EXT_debug_utils 扩展):

VkDebugUtilsLabelEXT markerInfo = {};
markerInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT;
markerInfo.pLabelName = "Begin Section";
vkCmdBeginDebugUtilsLabelEXT(cmd, &markerInfo);
// GPU commands
vkCmdEndDebugUtilsLabelEXT(cmd);

在 D3D12 和 Vulkan 中,标注区域按提交顺序处理,允许跨越多个 primary command buffer。Secondary command buffer(或 Bundle)中的标注必须是自封闭的,不允许不平衡。

Object Names(资源命名)

通过图形 API 为 GPU 资源设置名称,RenderDoc 在 UI 中会以该名称代替自动生成的默认名称显示。

注意:RenderDoc 不支持在同一 Capture 内多次修改同一资源的名称,只保留最后一次设置的名称。

D3D11SetPrivateData):

tex2d->SetPrivateData(WKPDID_D3DDebugObjectName, sizeof("Example Texture"), "Example Texture");

D3D12SetName):

tex2d->SetName(L"Example Texture");

OpenGLGL_KHR_debugglObjectLabel):

glObjectLabel(GL_TEXTURE, tex2d, -1, "Example Texture");

VulkanVK_EXT_debug_utilsvkSetDebugUtilsObjectNameEXT):

VkDebugUtilsObjectNameInfoEXT nameInfo = {};
nameInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT;
nameInfo.objectType = VK_OBJECT_TYPE_IMAGE;
nameInfo.objectHandle = (uint64_t)tex2d;
nameInfo.pObjectName = "Off-screen color framebuffer";
vkSetDebugUtilsObjectNameEXT(device, &nameInfo);

D3D12 还提供了 RenderDoc 扩展接口 IRenderDocDescriptorNamer,可通过 ID3D12DescriptorHeap 查询,用于为 SM6.6 ResourceDescriptorHeap[] 样式访问的 Descriptor 设置自定义名称。

Bookmarks(事件书签)

在 Event Browser 中,可以为感兴趣的 Event 添加书签(快捷键 Ctrl-B),用于快速跳转。书签保存在 .rdc 文件中,其他人打开同一 Capture 文件时可直接使用 Ctrl-1Ctrl-0 在书签间跳转,无需重新标注。

Resource Renaming(资源重命名)

在 Resource Inspector 窗口中,可以为任意资源提供覆盖名称,无论该资源原本是否有自定义名称。操作步骤:

  1. 在 Resource Inspector 中选中目标资源(通过绑定链接跳转,或按名称/类型搜索)。
  2. 点击 Rename Resource 按钮,输入新名称。
  3. Enter 或再次点击 Rename Resource 确认;按 Escape 或点击 Reset name 取消。

资源重命名同样会随 Capture 保存,后续加载时自动生效。

Capture Comments(附加文字说明)

在 Capture Comments 窗口中有一个自由文本输入框,可将任意文字(如环境信息、Build 版本说明)存入 .rdc 文件。默认情况下,打开包含 Comments 的 Capture 时会优先展示该内容;此行为可在 Settings 中关闭。


调用栈捕获配置与查看

概述

在非平凡的程序中,仅凭 Event Browser 中的 API 调用序列难以判断某个调用来自代码的哪个位置。RenderDoc 提供的 Callstack 采集功能,可为每个 API 调用记录代码侧的完整调用链,帮助快速定位问题源头。

注意(Windows):Callstack 采集依赖 dbghelp.dll。若应用自身也在使用该 DLL 进行调试,建议禁用应用自身的 dbghelp.dll 使用,避免与 RenderDoc 产生冲突。

采集时启用 Callstack

在 Launch Application 对话框中勾选 Collect callstacks,RenderDoc 会在每个 API 入口点采集调用栈并将其序列化到 .rdc 文件中。

若希望降低开销,可同时勾选 Only action stacks,仅在 action 类调用(Draw、Dispatch 等)时采集调用栈,以较低的代价换取最关键的信息。

Replay 时解析 Callstack

打开 Capture 后,在 API Inspector 底部可展开 Callstack 面板。初始状态显示”需要解析符号”。

解析步骤:

  1. 打开 Tools 菜单,选择 Resolve Symbols
  2. RenderDoc 会搜索已加载模块对应的 PDB/符号文件(包括 Microsoft Symbol Server 及 PE 元数据中指定的原始构建路径)。
  3. 若找不到某个 PDB,UI 会弹出提示要求手动定位,并将该路径记忆以备后续使用。
  4. 若确认某个第三方 PDB 永远不可用,可选择永久忽略,避免每次打开 Capture 时重复提示。已忽略的 PDB 列表可在 Settings 中查看和移除。

符号解析完成后,API Inspector 中的 Callstack 面板会显示当前选中 API 调用或 action 的完整调用栈,支持选中复制到剪贴板。

首次使用时可能需要从 Microsoft Symbol Server 下载符号,耗时较长;后续会从缓存中直接读取。