Vulkan提交命令缓冲区处理是否结束

Vulkan提交命令缓冲区处理是否结束
在使用信号时,应用程序不参与命令缓冲区的同步化处理过程。应用程序不知道何时已提交的命令会被执行完,何时未提交的命令会开始被执行。这些操作都发生在管线阶段中,对于应用程序来说这些信息都是不透明的。

但是,当想要知道指定命令缓冲区的处理过程何时结束时,就需要使用栅栏,这样就可以查明已提交的命令缓冲区是否会全部被设备处理完。

具体处理过程

(1)创建一个未发出状态的栅栏,将其存储在一个VkFence类型的变量中,将该变量命名为fence。
(2)创建一批命令缓冲区和用于指明提交命令缓冲区的操作是否完成的信号。当将命令缓冲区提交给指定队列时,使用这些创建好的数据。在执行提交操作的过程中使用fence变量。
(3)通过调用WaitForFences(logical_device,{fence},VK_FALSE,timeout)函数,使应用程序等待创建好的栅栏。将第一个参数设置为逻辑设备(所有可用资源都会通过逻辑设备被创建好)的句柄;将第二个参数设置为fence变量;将第三个参数设置为VK_FALSE(该值用于指明应用程序是否需要等待在函数调用中使用的所有栅栏的状态都变为已发出);将第四个参数设置为超时时间值。
(4)当应用程序结束等待并且该函数调用操作的返回值等于VK_SUCCESS时,意味着通过fence变量提交给队列的一批命令缓冲区中的所有命令缓冲区都被成功处理完毕。

具体运行情况

应用程序与已提交命令缓冲区的同步化是通过两个步骤实现的。首先,创建一个栅栏,创建命令缓冲区并将命令缓冲区提交给队列。注意,在提交命令缓冲区的过程中不要忘记使用创建好的栅栏。

Vulkan提交命令缓冲区处理是否结束
然后,只需要使应用程序等待,直到栅栏的状态变为已发出为止。

Vulkan提交命令缓冲区处理是否结束
这样,我们就能够确认已提交的命令缓冲区被设备成功处理了。

但是,典型的渲染场景不会使我们编写的应用程序彻底暂停,因此这纯粹是浪费时间。我们应该查明栅栏的状态是否变为已发出。如果栅栏的状态没有变为已发出,就应该使应用程序利用剩余的时间处理其他任务(如提高人工智能和更精确地计算物理效果),并定期检查栅栏的状态。如果栅栏的状态变为已发出,就应该使应用程序根据已提交的命令执行任务。

当想要重用命令缓冲区时也可以使用栅栏,在重新记录命令缓冲区前,必须确保它们不再被设备执行。我们应该拥有大量的命令缓冲区并且一个接一个地提交它们,只有这样才能使用所有这些命令缓冲区,使应用程序等待栅栏(每一批被提交的命令缓冲区都应该拥有与之相关的栅栏)。命令缓冲区的批次越多,应用程序等待栅栏的时间就会越短。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!

 

Vulkan实战