[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 的 堆
- 一个命令列表只能绑定一个命令分配器
- 一个命令分配器可以由多个命令列表绑定
- 命令是传递给命令分配器的
- 命令列表最终会加入到命令队列中
# 资源堆的类型
贴图等一系列的资源存放在特定的显存块中,D3D 通过 CreateCommittedResource
创建一个资源和一个堆,其中我们可以对堆的类型进行限定
- 默认堆:只有 GPU 能访问,如深度 / 模板缓冲区,只有 GPU 需要访问
- 上传堆:在此堆里提交的资源都需要经过 CPU 上传至 GPU。
- 回读堆:在这种堆里提交的都是需要 CPU 读取的资源
- 自定义堆
上传堆和回读堆都会对性能造成一定程度影响
所以一般都存放到默认堆中