线程

Vulkan 和 OpenGL 之间的一大区别是 Vulkan 不限于单线程状态机系统。在应用程序中开始实现线程之前,了解 Vulkan 中线程的工作原理非常重要。

Vulkan 规范的 线程行为部分 详细解释了应用程序如何负责管理 Vulkan 的所有外部同步元素。重要的是要意识到 Vulkan 中的多线程仅提供主机端的扩展,因为任何与设备交互的内容仍然需要正确同步

Vulkan 实现不应该引入任何多线程,因此如果应用程序想要多 CPU 性能,则应用程序负责管理线程。

命令池

命令池是一个允许跨多个线程记录命令缓冲区的系统。单个命令池必须进行外部同步;不能从多个线程同时访问。通过在每个主机线程中使用单独的命令池,应用程序可以并行创建多个命令缓冲区,而无需任何代价高昂的锁。

这个想法是命令缓冲区可以在多个线程上记录,同时有一个相对较轻的线程来处理提交。

threading_command_buffers.png

Khronos 的示例和教程更详细地展示了如何并行记录命令缓冲区。

描述符池

描述符池用于分配、释放、重置和更新描述符集。通过创建多个描述符池,每个应用程序主机线程能够同时管理每个描述符池中的一个描述符集。