--- title: D3D12RHI date: 2026-05-03 00:00:00 excerpt: ARC 引擎 D3D12 RHI 改进——提交间隔记录器、DRED 调试增强、PSO 异步创建、纹理池管理等 tags: - ARC - D3D12RHI rating: ⭐ --- # D3D12RHI — D3D12 RHI 改进 返回 [[ARC引擎修改总览]] ## 概述 D3D12RHI 是 ARC 引擎修改量第二大的模块(60 个文件),但与卡通渲染无关。这些修改主要是**底层 GPU 基础设施的性能优化和调试增强**,部分可能从后续 UE 版本回移,部分是为主机平台开发的专用功能。 ## 功能列表 | 功能 | 说明 | |------|------| | 提交间隔记录器 | GPU 帧间提交间隔分析 | | DRED 调试增强 | GPU 崩溃时的扩展诊断 | | 其他 RHI 改进 | PSO 异步、纹理池、CommandList 等 | ## 新增文件 - `Source/Runtime/D3D12RHI/Public/D3D12RHIBridge.h` — 暴露 D3D12 命令队列供外部访问 --- ## 提交间隔记录器 ### 概述 Submission Gap Recorder(`D3D12_SUBMISSION_GAP_RECORDER`)是一个 GPU 性能分析系统,记录 D3D12 Command List 提交之间的间隔时间,用于识别 CPU-GPU 同步瓶颈和提交延迟。 ### 功能 - 记录每帧 Command List 提交的时间戳 - 计算相邻提交之间的间隔(Gap) - 识别异常长的提交间隔(可能的 CPU stall 或 GPU bubble) - 提供统计数据用于性能优化 ### 使用场景 - 分析格斗游戏中的帧率卡顿原因 - 排查 CPU 提交瓶颈 - 验证多线程命令录制的效率 ### 代码修改情况 | 文件路径 | 修改类型 | 修改内容 | |---------|---------|---------| | `Source/Runtime/D3D12RHI/Private/D3D12Commands.cpp` | 修改 | Command List 提交路径插入时间戳记录 | | `Source/Runtime/D3D12RHI/Private/D3D12CommandList.h` | 修改 | `D3D12_SUBMISSION_GAP_RECORDER` 宏和数据结构 | | `Source/Runtime/D3D12RHI/Private/D3D12Queue.cpp` | 修改 | 提交间隔计算和统计输出 | --- ## DRED 调试增强 ### 概述 DRED(Device Removed Extended Data)是 D3D12 的 GPU 崩溃诊断机制。ARC 引擎增强了 DRED 的使用,在 GPU 崩溃时提供更详细的面包屑(Breadcrumb)上下文信息。 ### 增强内容 #### 面包屑上下文 在关键渲染操作处插入 Breadcrumb 标记,GPU 崩溃时可以追溯到具体的操作步骤: - 绘制调用标记 - 资源状态转换标记 - 计算着色器调度标记 #### 向量化异常处理器 新增 Vectored Exception Handler,在 Windows 异常触发时检查 D3D12 Debug 消息: - 捕获 D3D12 设备丢失事件 - 自动收集 DRED 信息 - 输出到日志供崩溃分析 ### 使用场景 - 主机开发中 GPU 挂起的排查 - 复杂着色器导致的设备丢失诊断 - CI/CIS 环境中的自动化崩溃分析 ### 代码修改情况 | 文件路径 | 修改类型 | 修改内容 | |---------|---------|---------| | `Source/Runtime/D3D12RHI/Private/D3D12Device.cpp` | 修改 | DRED 初始化和 Breadcrumb 配置 | | `Source/Runtime/D3D12RHI/Private/D3D12Commands.cpp` | 修改 | 关键操作处插入 Breadcrumb 标记 | | `Source/Runtime/D3D12RHI/Private/D3D12Util.cpp` | 修改 | Vectored Exception Handler 注册 + D3D12 Debug 消息检查 | --- ## 其他 RHI 改进 ### 概述 ARC 引擎在 D3D12 RHI 层面做了多项基础设施改进,涵盖 PSO 管理、纹理内存、命令列表执行和光线追踪支持。 ### PSO 异步创建 #### Busy-Wait + Stall 告警 PSO 创建改为异步模式,当 Shader 未就绪时 busy-wait 并记录 stall 时间: ```cpp // PSO 创建等待时输出告警日志 // 帮助识别哪些 Shader 组合导致了渲染卡顿 ``` #### 部分编译(bPartial) Ray Tracing Pipeline 支持部分编译——不需要等待所有 Hit Shader 就绪即可使用基础管线。参见 [[光线追踪与PSO]]。 ### 纹理池管理 新增 CVar `D3D12.TexturePoolOnlyAccountStreamableTexture`: - 纹理池统计时仅计算可流式加载的纹理 - 避免非流式纹理(如 UI、字体)干扰流式预算 ### CommandList 任务分流 CVar `r.D3D12.ExecuteCommandListTask`: - 将部分 Command List 执行工作从 RHI 线程分流到 Task 线程 - 减少 RHI 线程压力 ### Ray Tracing 改进 - View Descriptor Heap 扩展到 250k 描述符 - BLAS Compaction 支持(减少加速结构内存占用) - PSO 缓存改进 ### Buffer Staging 改进 GPU Readback 的 Staging Buffer 管理,减少 CPU-GPU 同步开销。 ### Back Buffer 引用 安全处理 Presentable Texture 的引用计数,防止拷贝操作时的悬空引用。 ### D3D12RHIBridge 新增 `D3D12RHIBridge.h`,暴露底层接口供外部模块使用: ```cpp // 获取图形命令列表和队列 GetGfxCommandListAndQueue(); // 获取拷贝命令队列 GetCopyCommandQueue(); ``` ### 代码修改情况 | 文件路径 | 修改类型 | 修改内容 | |---------|---------|---------| | `Source/Runtime/D3D12RHI/Private/D3D12PipelineState.cpp` | 修改 | PSO 异步创建 + Busy-Wait + Stall 告警日志 | | `Source/Runtime/D3D12RHI/Private/D3D12Texture.cpp` | 修改 | `TexturePoolOnlyAccountStreamableTexture` CVar 纹理池统计 | | `Source/Runtime/D3D12RHI/Private/D3D12Commands.cpp` | 修改 | `ExecuteCommandListTask` CVar 任务分流 | | `Source/Runtime/D3D12RHI/Private/D3D12RayTracing.cpp` | 修改 | View Descriptor Heap 250k + BLAS Compaction | | `Source/Runtime/D3D12RHI/Private/D3D12Staging.cpp` | 修改 | Staging Buffer 改进 | | `Source/Runtime/D3D12RHI/Private/D3D12Viewport.cpp` | 修改 | Back Buffer 引用安全处理 | | `Source/Runtime/D3D12RHI/Public/D3D12RHIBridge.h` | **新增文件** | 暴露 `GetGfxCommandListAndQueue` / `GetCopyCommandQueue` |