[toc]

# 引用

https://docs.microsoft.com/zh-cn/windows/win32/direct3d12/design-philosophy-of-command-queues-and-command-lists

# 概述

早先的 OpenGL 和 DirectX 在渲染时通常是在资源设置完毕后直接提交给 GPU 进行渲染,这种线性的流程很难进行并行化的设计。
为了改善这一问题,实现 工作的重用多线程的利用 ,需要对 应用向GPU提交渲染工作的方式 进行根本性的设计与改变。 新版的提交当时相对于早期的提交方式主要有以下几个不同:

  • 删除即时上下文 ( 不再存在与单个设备关联的即时上下文 ), 此举是为了可多线程化
  • GPU 工作项的分组
  • GPU 工作提交

# 概念

# 命令队列

命令队列是 CPU 与 GPU 进行交互的容器

# 命令列表

命令列表的两个状态:

记录状态和关闭状态

记录状态中可以将命令添加到命令列表对应的命令分配器中
关闭状态即停止记录命令

# 命令分配器

命令分配器实际上是用于命令的 GPU 内存,命令分配器中存储实际的命令 命令列表执行完后需要调用 reset 来释放命令分配器的内存。, 在 reset 之前,必须检查围栏来确保与命令分配器相关联的命令列表均已完成执行。 上图表现得就是命令列表与命令分配器、命令队列之间的关系 GPU 资源都存在特定的显存块中,被称为 GPU 的

  1. 一个命令列表只能绑定一个命令分配器
  2. 一个命令分配器可以由多个命令列表绑定
  3. 命令是传递给命令分配器的
  4. 命令列表最终会加入到命令队列中

# 资源堆的类型

贴图等一系列的资源存放在特定的显存块中,D3D 通过 CreateCommittedResource 创建一个资源和一个堆,其中我们可以对堆的类型进行限定

  • 默认堆:只有 GPU 能访问,如深度 / 模板缓冲区,只有 GPU 需要访问
  • 上传堆:在此堆里提交的资源都需要经过 CPU 上传至 GPU。
  • 回读堆:在这种堆里提交的都是需要 CPU 读取的资源
  • 自定义堆

上传堆和回读堆都会对性能造成一定程度影响
所以一般都存放到默认堆中