我正在尝试使用Vulkan设置多线程渲染器,我对命令池有疑问。
在https://on-demand.gputechconf.com/siggraph/2016/video/sig1625-tristan-lorach-vulkan-nvidia-essentials.mp4的第13分钟,他们讨论了如何为每个FRAME分配1个命令池并将其循环到环形缓冲区中。
为什么要为每个线程分配3个命令池(在3帧环形缓冲区中为每个帧分配一个命令池),而不是每个线程只有一个命令池并从中分配3个命令缓冲区?
答案 0 :(得分:2)
我认为这里的前提是vkResetCommandPool
优于重置单个命令缓冲区。这还需要VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT
标志,该规范的存在本身暗示了 可能并非免费的重置单个cmd缓冲区的能力。
实际上,演讲者是这样说的,如果您不仅阅读幻灯片,还获得完整的演示文稿。
答案 1 :(得分:1)
这基本上是关于限制必须执行的同步和状态跟踪的数量。如果每个线程每帧每个帧都有一个命令池,那么无论您为该帧在其中创建了多少命令缓冲区,都只需跟踪一个事件以完成操作,然后重置整个命令池即可。
从引擎的角度来看,这对于您不打算多次重用的命令缓冲区非常有用-命令缓冲区变成无状态火灾,并且忘记了实体,您只需要持久地跟踪池即可。
确切的权衡在这里因应用程序和应用程序以及驱动程序而异,所以从YMMV的最佳使用角度来看。
答案 2 :(得分:0)
对命令缓冲区进行写操作可能会导致其父命令缓冲区池上发生某些工作。例如,内存分配。这就是为什么您不应在不同步的情况下从多个线程执行多个影响同一池的操作。因此,您可能希望每个线程/帧对都有专用的池,以简化同步。使用它们的池批量重置命令缓冲区是另一个原因。