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

172 lines
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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 调试增强
### 概述
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` |