繁体   English   中英

在 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 个命令缓冲区?

我认为这里的前提是vkResetCommandPool比重置单个命令缓冲区更好。 这也需要VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT标志,它的存在是规范本身的一个小提示,即重置单个 cmdbuffer 的能力可能不是免费的。

实际上,如果您不只是阅读幻灯片而是获得完整的演示文稿,那么演讲者会这么说。

它基本上是关于限制你必须做多少同步和状态跟踪。 如果每个线程每帧有一个命令池,那么您只需要跟踪一个事件以完成,然后重置整个命令池,无论您在其中为该帧创建了多少命令缓冲区。

从引擎的角度来看,这对于您不打算多次重复使用的命令缓冲区来说非常好 - 它们变成无状态火灾并忘记实体,您只需要持续跟踪池。

确切的权衡将因应用程序和应用程序以及驱动程序而异,因此 YMMV 就最佳效果而言。

将操作写入命令缓冲区可能会导致在其父命令缓冲池上发生一些工作。 例如,内存分配。 这就是为什么您不应该在不同步的情况下从多个线程执行影响同一个池的多个操作。 因此,您可能更愿意为每个线程/帧对设置专用池以简化同步。 使用它们的池批量重置命令缓冲区是另一个原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM