vulkan中的指令队列的大致原理

在vulkan中,指令池vkCommandPool分配指令缓冲vkCommandBuffer,而指令缓冲用于记录计算、渲染指令,记录完后,把该指令缓冲提交给指令队列vkQueue,然后等待执行。

实际上就可以简单理解为:

  • 每个指令 <=> 一行有效代码、一个原子操作
  • 指令缓冲vkCommandBuffer <=> 一个函数
  • 指令队列vkQueue <=> 一个队列,每个元素是一个函数指针
class CommandQueue 
{
public:
    // 提交指令到队列
    void Submit(std::function<void()> command) 
    {
        commandQueue.push(command);
    }

    // 处理队列中的指令
    void ExecuteCommands() 
    {
        while (!commandQueue.empty()) 
        {
            auto command = commandQueue.front();
            command();
            commandQueue.pop();
        }
    }

private:
    std::queue<std::function<void()>> commandQueue;
};

int main() 
{
    CommandQueue commandQueue;

    // 提交3个指令缓冲到队列,每个指令缓冲相当于一个函数,这里用lambda表达式
    commandQueue.Submit([]() { std::cout << "Command 1 executed." << std::endl; });
    commandQueue.Submit([]() { std::cout << "Command 2 executed." << std::endl; });
    commandQueue.Submit([]() { std::cout << "Command 3 executed." << std::endl; });

    // 处理队列中的指令
    commandQueue.ExecuteCommands();
    return 0;
}

几乎所有指令队列大概都是这么个原理,在多线程中,要把某些计算任务交给另一个线程进行异步执行也是这样做,即先在主线程生成指令、待执行的函数等,塞到指令队列中,然后在另一个线程中执行该队列的指令。完事做好同步即可。

你可能感兴趣的:(Vulkan,c++)