在 Vulkan 中,核心的队列类型主要有三种。它们负责将 CPU 提交的命令缓冲区分发到 GPU 的不同硬件单元上执行。
Vulkan 通过队列族(Queue Family)来管理这些队列。一个队列族可以支持一种或多种队列类型,最核心的三种队列类型如下。
1. 图形队列(Graphics Queue)#
- 核心职能:负责处理所有传统 3D / 2D 图形渲染管线任务。
- 常见操作:绑定顶点缓冲区、设置管线状态、绘制命令、视口设置、光栅化、片元着色器执行等。
- 特点:这是游戏和图形应用中最常用的队列。在大多数独立显卡上,图形队列族通常不只处理渲染流程中的步骤,也会隐式包含计算和传输功能。
2. 计算队列(Compute Queue)#
- 核心职能:负责执行计算着色器(Compute Shader),即 GPGPU(General-Purpose GPU)任务。
- 常见操作:并行计算、物理模拟、图像后处理、粒子系统更新,以及 AI / 机器学习推断等。
- 特点:它不需要走传统的光栅化、混合等图形管线。许多现代显卡提供异步计算(Async Compute)能力,允许独立的计算队列与图形队列并行执行,从而更充分地利用 GPU 硬件。
3. 传输队列(Transfer Queue)#
- 核心职能:专门负责内存数据的复制和传输。
- 常见操作:显存与系统内存之间的拷贝,将 staging buffer(暂存缓冲区)中的数据上传到高性能的本地显存中。
- 特点:传输队列通常映射到 GPU 的 DMA(Direct Memory Access,直接内存访问)引擎。使用独立的传输队列可以在后台上传纹理、模型网格等资源,而不阻塞主图形队列的渲染,从而实现更平滑的资源加载。
补充:第四种常见类型#
除了上述三大核心队列,标准 Vulkan 硬件中还经常出现第四种队列类型。
- 稀疏绑定队列(Sparse Binding Queue):标记为
VK_QUEUE_SPARSE_BINDING_BIT。它用于管理稀疏资源,比如大型虚拟纹理,允许将虚拟内存页动态绑定到实际的物理显存分配上。