2026-03-26 16:45:24 +08:00
|
|
|
|
# RenderDocCapture
|
|
|
|
|
|
|
|
|
|
|
|
**命名空间**: `XCEngine::Debug`
|
|
|
|
|
|
|
|
|
|
|
|
**类型**: `class (singleton)`
|
|
|
|
|
|
|
|
|
|
|
|
**头文件**: `XCEngine/Debug/RenderDocCapture.h`
|
|
|
|
|
|
|
2026-03-26 17:21:44 +08:00
|
|
|
|
**描述**: 在 Windows 上动态加载 RenderDoc,并为引擎或测试程序提供抓帧入口。
|
2026-03-26 16:45:24 +08:00
|
|
|
|
|
|
|
|
|
|
## 概述
|
|
|
|
|
|
|
2026-03-26 17:21:44 +08:00
|
|
|
|
`RenderDocCapture` 把外部 GPU 调试工具接入到引擎运行流程中。它的价值不在于替代 RenderDoc,而在于让测试程序、后端样例和编辑器工具可以用统一代码主动触发捕获。
|
|
|
|
|
|
|
|
|
|
|
|
当前实现的关键事实:
|
|
|
|
|
|
|
|
|
|
|
|
- 公共头文件直接依赖 `windows.h`,因此它是明显的 Windows 专用 API。
|
|
|
|
|
|
- 运行时会尝试从当前可执行文件目录加载 `renderdoc.dll`。
|
|
|
|
|
|
- 初始化时可以先只传入 `window` 或者都传 `nullptr`,稍后再通过 [SetDevice](SetDevice.md) / [SetWindow](SetWindow.md) 补齐。
|
|
|
|
|
|
- 抓帧前要求 RenderDoc 已加载,且 `device` 与 `window` 都不为空。
|
|
|
|
|
|
|
|
|
|
|
|
## 当前实现边界
|
|
|
|
|
|
|
|
|
|
|
|
- 只封装了 RenderDoc 1.7.0 API 中的一小部分函数。
|
|
|
|
|
|
- `Initialize` 是幂等的;如果已经初始化,再次调用不会刷新 `device` 和 `window` 参数。
|
|
|
|
|
|
- `LaunchReplayUI` 的底层 RenderDoc 调用没有返回值,XCEngine 只能报告“请求已发出”,不能证明 UI 一定成功启动。
|
|
|
|
|
|
- `SetCaptureComments` 当前直接把 `nullptr` 作为 capture file path 传给 RenderDoc。
|
|
|
|
|
|
|
|
|
|
|
|
## 线程语义
|
|
|
|
|
|
|
|
|
|
|
|
- 当前实现没有显式同步机制。
|
|
|
|
|
|
- 典型使用方式是在创建窗口和图形设备的主线程上完成初始化、抓帧和关闭。
|
|
|
|
|
|
- `BeginCapture` 和 `TriggerCapture` 会尝试把窗口设为前台并设置焦点,这属于有副作用的 UI 行为。
|
2026-03-26 16:45:24 +08:00
|
|
|
|
|
|
|
|
|
|
## 声明概览
|
|
|
|
|
|
|
|
|
|
|
|
| 声明 | 类型 | 说明 |
|
|
|
|
|
|
|------|------|------|
|
2026-03-26 17:21:44 +08:00
|
|
|
|
| `RenderDocCaptureInfo` | `struct` | 保存单个 capture 的文件名、长度和时间戳。 |
|
|
|
|
|
|
| `RenderDocCapture` | `class` | RenderDoc 封装与抓帧控制入口。 |
|
2026-03-26 16:45:24 +08:00
|
|
|
|
|
2026-03-26 17:21:44 +08:00
|
|
|
|
## 公开方法
|
2026-03-26 16:45:24 +08:00
|
|
|
|
|
2026-03-26 17:21:44 +08:00
|
|
|
|
| 方法 | 说明 |
|
2026-03-26 16:45:24 +08:00
|
|
|
|
|------|------|
|
2026-03-26 17:21:44 +08:00
|
|
|
|
| [Get](Get.md) | 获取全局 `RenderDocCapture` 实例。 |
|
|
|
|
|
|
| [Initialize](Initialize.md) | 加载 RenderDoc 并记录设备/窗口句柄。 |
|
|
|
|
|
|
| [Shutdown](Shutdown.md) | 结束抓帧并卸载 RenderDoc。 |
|
|
|
|
|
|
| [SetDevice](SetDevice.md) | 更新当前活动图形设备指针。 |
|
|
|
|
|
|
| [SetWindow](SetWindow.md) | 更新当前活动窗口句柄。 |
|
|
|
|
|
|
| [IsLoaded](IsLoaded.md) | 查询 RenderDoc 是否成功加载。 |
|
|
|
|
|
|
| [IsCapturing](IsCapturing.md) | 查询当前是否处于抓帧中。 |
|
|
|
|
|
|
| [GetNumCaptures](GetNumCaptures.md) | 查询可访问的 capture 数量。 |
|
|
|
|
|
|
| [GetCapture](GetCapture.md) | 读取指定 capture 的元数据。 |
|
|
|
|
|
|
| [BeginCapture](BeginCapture.md) | 开始一次手动抓帧。 |
|
|
|
|
|
|
| [EndCapture](EndCapture.md) | 结束当前抓帧。 |
|
|
|
|
|
|
| [TriggerCapture](TriggerCapture.md) | 请求 RenderDoc 触发一次 capture。 |
|
|
|
|
|
|
| [SetCaptureFilePath](SetCaptureFilePath.md) | 设置 capture 文件路径模板。 |
|
|
|
|
|
|
| [SetCaptureComments](SetCaptureComments.md) | 设置 capture 注释。 |
|
|
|
|
|
|
| [SetCaptureOptionU32](SetCaptureOptionU32.md) | 以原始 option id 设置 U32 选项。 |
|
|
|
|
|
|
| [LaunchReplayUI](LaunchReplayUI.md) | 请求启动 RenderDoc Replay UI。 |
|
|
|
|
|
|
|
|
|
|
|
|
## 真实使用位置
|
|
|
|
|
|
|
|
|
|
|
|
当前代码库已经在多个 D3D12 / OpenGL 集成测试中使用它:
|
|
|
|
|
|
|
|
|
|
|
|
- 先创建窗口。
|
|
|
|
|
|
- 调用 `Initialize(nullptr, hwnd)`。
|
|
|
|
|
|
- 图形设备初始化完成后调用 `SetDevice(...)`。
|
|
|
|
|
|
- 在目标帧前后调用 `BeginCapture` / `EndCapture`。
|
2026-03-26 16:45:24 +08:00
|
|
|
|
|
|
|
|
|
|
## 相关文档
|
|
|
|
|
|
|
2026-03-26 17:21:44 +08:00
|
|
|
|
- [当前模块](../Debug.md)
|
|
|
|
|
|
- [RenderDoc Capture Workflow](../../../_guides/Debug/RenderDoc-Capture-Workflow.md)
|