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

5.5 KiB
Raw Blame History

title, date, excerpt, tags, rating
title date excerpt tags rating
D3D12RHI 2026-05-03 00:00:00 ARC 引擎 D3D12 RHI 改进——提交间隔记录器、DRED 调试增强、PSO 异步创建、纹理池管理等
ARC
D3D12RHI

D3D12RHI — D3D12 RHI 改进

返回 ARC引擎修改总览

概述

D3D12RHI 是 ARC 引擎修改量第二大的模块60 个文件),但与卡通渲染无关。这些修改主要是底层 GPU 基础设施的性能优化和调试增强,部分可能从后续 UE 版本回移,部分是为主机平台开发的专用功能。

功能列表

功能 说明
提交间隔记录器 GPU 帧间提交间隔分析
DRED 调试增强 GPU 崩溃时的扩展诊断
其他 RHI 改进 PSO 异步、纹理池、CommandList 等

新增文件

  • Source/Runtime/D3D12RHI/Public/D3D12RHIBridge.h — 暴露 D3D12 命令队列供外部访问

提交间隔记录器

概述

Submission Gap RecorderD3D12_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 时间:

// 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