5.5 KiB
title, date, excerpt, tags, rating
| title | date | excerpt | tags | rating | ||
|---|---|---|---|---|---|---|
| D3D12RHI | 2026-05-03 00:00:00 | ARC 引擎 D3D12 RHI 改进——提交间隔记录器、DRED 调试增强、PSO 异步创建、纹理池管理等 |
|
⭐ |
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 时间:
// 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,暴露底层接口供外部模块使用:
// 获取图形命令列表和队列
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 |