gpt4 book ai didi

c++ - Vulkan:如何在单独的线程中记录命令缓冲区?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:12:33 25 4
gpt4 key购买 nike

我不太了解如何在 Vulkan 中并行处理不同线程上的工作。

为了开始发出 vkCmd*s,您需要开始渲染过程。调用 begin render pass 需要引用帧缓冲区。但是,不保证 vkAcquireNextImageKHR() 以循环方式返回图像索引。因此,在三缓冲设置中,如果当前图像索引为 0,我不能只绑定(bind)帧缓冲区 1 并开始为下一帧发出绘制调用,因为下一次调用 vkAcquireNextImageKHR() 可能会返回图像索引 2。

无需提前指定要使用的帧缓冲区即可记录命令的正确方法是什么?

最佳答案

您有一个或多个要在每一帧执行的渲染过程。每一个都有一个或多个子 channel ,你想在其中投入工作。因此,您的主渲染线程将为这些子 channel 生成一个或多个辅助命令缓冲区,并将该辅助 CB 序列传递给提交线程。

提交线程将创建要呈现的主要 CB。它开始/结束渲染 channel ,并在每个子 channel 中执行在渲染线程上为该特定子 channel 创建的辅助 CB。

所以每个线程都在创建自己的命令缓冲区。提交线程是处理 VkFramebuffer 对象的线程,因为它开始渲染过程。它也是获取交换链图像等的那个。渲染线程是制作完成所有实际工作的辅助 CB 的线程。

是的,您仍将在提交线程上进行一些 CB 构建,但总体上应该非常简约。这也用于从渲染线程中抽象出渲染目标的细节,以便处理交换链的代码可以本地化到提交线程。这为您提供了更大的灵 active 。

例如,如果您想要三重缓冲区,而交换链实际上不允许这样做,那么您的提交线程可以创建自己的额外图像,然后从其内部图像复制到真正的交换链中。渲染线程的代码根本不需要被打扰就可以做到这一点。

关于c++ - Vulkan:如何在单独的线程中记录命令缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48615465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com