我正在关注vulkan教程,该教程目前在交换链娱乐中。
https://vulkan-tutorial.com/Drawing_a_triangle/Swap_chain_recreation
我们应该通过将布尔变量framebufferResized设置为true来显式处理大小调整,无论是否调用窗口调整大小回调方法。然后,如果窗口已调整大小,我们将在名为每帧的drawFrame方法中重新创建交换链。像下面这样。
VkResult result = vkAcquireNextImageKHR(device, swapChain, UINT64_MAX, imageAvailableSemaphores[currentFrame], VK_NULL_HANDLE, &imageIndex);
...
result = vkQueuePresentKHR(presentQueue, &presentInfo);
if (result == VK_ERROR_OUT_OF_DATE_KHR || result == VK_SUBOPTIMAL_KHR || framebufferResized) {
framebufferResized = false;
recreateSwapChain();
}
这是我在教程中感到困惑的语句:“在vkQueuePresentKHR之后执行此操作很重要,以确保信号量处于一致状态,否则可能永远不会正确等待发出信号的信号量。” 我假设的“ this”是对布尔型framebufferResized和随后的recreateSwapChain()的检查。信号量只是确保在绘制图像之前成功获取图像,然后在呈现图像之前成功绘制图像的信号量。因此,对于我而言,作者所说的毫无意义。
大概,“信号”是指,vkAcquire
而交换链的娱乐活动则受到的保护vkDeviceWaitIdle
。并且可能是作者担心VK_SUBOPTIMAL
,并且在这种情况下想重新创建交换链。
但是vkDeviceWaitIdle
不涵盖来自的未决信号量vkAcquire
,如此处确认:https : //github.com/KhronosGroup/Vulkan-Docs/issues/1059。
这意味着该信号量必须首先由来等待vkQueueSubmit
。只有这样,信号才能被vk*WaitIdle
命令捕获,并且只有在以有效方式销毁信号后才能捕获该信号。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句