172 lines
5.5 KiB
Markdown
172 lines
5.5 KiB
Markdown
---
|
||
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` |
|