Files
BlueRoseNote/03-UnrealEngine/卡通渲染相关资料/渲染功能/ARC/D3D12RHI/D3D12RHI.md

172 lines
5.5 KiB
Markdown
Raw Normal View History

2026-05-03 20:37:58 +08:00
---
title: D3D12RHI
date: 2026-05-03 00:00:00
2026-05-03 21:38:46 +08:00
excerpt: ARC 引擎 D3D12 RHI 改进——提交间隔记录器、DRED 调试增强、PSO 异步创建、纹理池管理等
2026-05-03 20:37:58 +08:00
tags:
- ARC
- D3D12RHI
rating: ⭐
---
# D3D12RHI — D3D12 RHI 改进
返回 [[ARC引擎修改总览]]
## 概述
D3D12RHI 是 ARC 引擎修改量第二大的模块60 个文件),但与卡通渲染无关。这些修改主要是**底层 GPU 基础设施的性能优化和调试增强**,部分可能从后续 UE 版本回移,部分是为主机平台开发的专用功能。
## 功能列表
2026-05-03 21:38:46 +08:00
| 功能 | 说明 |
|------|------|
| 提交间隔记录器 | GPU 帧间提交间隔分析 |
| DRED 调试增强 | GPU 崩溃时的扩展诊断 |
| 其他 RHI 改进 | PSO 异步、纹理池、CommandList 等 |
2026-05-03 20:37:58 +08:00
## 新增文件
- `Source/Runtime/D3D12RHI/Public/D3D12RHIBridge.h` — 暴露 D3D12 命令队列供外部访问
2026-05-03 21:38:46 +08:00
---
## 提交间隔记录器
### 概述
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 调试增强
### 概述
DREDDevice 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` |