在 Vulkan 中为每个线程创建多个命令池
Creating multiple command pools per thread in Vulkan
我正在尝试使用 Vulkan 设置多线程渲染器,但我对命令池有疑问。
这里 https://on-demand.gputechconf.com/siggraph/2016/video/sig1625-tristan-lorach-vulkan-nvidia-essentials.mp4 在第 13 分钟,他们讨论了如何为每个 FRAME 创建 1 个命令池并在环形缓冲区中循环它们。
为什么每个线程分配 3 个命令池(一个用于 3 帧环形缓冲区中的每个帧)而不是每个线程只有一个命令池并从中分配 3 个命令缓冲区?
这基本上是关于限制您必须进行多少同步和状态跟踪。如果每个线程每个帧都有一个命令池,那么您只需要跟踪一个事件完成,然后重置整个命令池,无论您为该帧在其中创建了多少个命令缓冲区。
从引擎的角度来看,这对于您不打算重复使用多次的命令缓冲区来说可能非常好 - 它们变成无状态的 fire and forget 实体,您只需要持续跟踪池。
具体的权衡将因应用程序和驱动程序而异,因此 YMMV 就什么最有效而言。
我认为这里的前提是 vkResetCommandPool
比重置单个命令缓冲区要好。这也需要 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT
标志,其存在是规范本身的一个小暗示,即重置单个 cmdbuffer 的能力 可能 不是免费的。
实际上演讲者是这么说的,如果你不只是阅读幻灯片,而是获得完整的演示文稿。
我正在尝试使用 Vulkan 设置多线程渲染器,但我对命令池有疑问。
这里 https://on-demand.gputechconf.com/siggraph/2016/video/sig1625-tristan-lorach-vulkan-nvidia-essentials.mp4 在第 13 分钟,他们讨论了如何为每个 FRAME 创建 1 个命令池并在环形缓冲区中循环它们。
为什么每个线程分配 3 个命令池(一个用于 3 帧环形缓冲区中的每个帧)而不是每个线程只有一个命令池并从中分配 3 个命令缓冲区?
这基本上是关于限制您必须进行多少同步和状态跟踪。如果每个线程每个帧都有一个命令池,那么您只需要跟踪一个事件完成,然后重置整个命令池,无论您为该帧在其中创建了多少个命令缓冲区。
从引擎的角度来看,这对于您不打算重复使用多次的命令缓冲区来说可能非常好 - 它们变成无状态的 fire and forget 实体,您只需要持续跟踪池。
具体的权衡将因应用程序和驱动程序而异,因此 YMMV 就什么最有效而言。
我认为这里的前提是 vkResetCommandPool
比重置单个命令缓冲区要好。这也需要 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT
标志,其存在是规范本身的一个小暗示,即重置单个 cmdbuffer 的能力 可能 不是免费的。
实际上演讲者是这么说的,如果你不只是阅读幻灯片,而是获得完整的演示文稿。