我有如下代码:
vkQueueSubmit(queue, 1, &infoB, fenceB); // ~130 ms to complete
while(1) {
vkWaitForFences(device, 1, &fenceA, true, UINT64_MAX);
vkResetFences(device, 1, &fenceA);
if (vkGetFenceStatus(device, fenceB) == VK_SUCCESS) {
vkResetFences(device, 1, &fenceB);
// do stuff
}
vkQueueSubmit(queue, 1, &infoA, fenceA); // ~1 ms to complete
}
并且由于某种原因,在重置fenceA之后,它会在下一次迭代中等待循环外提交的工作。
这里发生了什么事?
您正在向单个队列提交。管道阶段可以重叠,但即使没有障碍,向管道头部发出的命令也可能是~串行的。
在第一次迭代结束时,你的队列如下所示:
您的第一次迭代跳过了等待 Fence B,但第二次迭代将等待 Fence A,而 Info A 的工作可能会卡在队列中等待 Info B 提交首先完成。
如果您希望事情并行进行以减慢工作速度,则需要使用两个队列,但即使这样,您也可能会发现停滞,具体取决于硬件实际可以并行运行的队列数量。