Vulkan:为什么我们需要在VkQueuePresentKHR之后检查窗口调整大小

亨利·怀斯

我正在关注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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我们需要在ConnectionString中设置最小池大小

来自分类Dev

为什么我们需要在ConnectionString中设置最小池大小

来自分类Dev

为什么我们需要在Linux上挂载?

来自分类Dev

为什么我们需要在Linux上挂载?

来自分类Dev

什么时候以及为什么我们需要在bash上使用“ wait”命令?

来自分类Dev

我们为什么要写窗口?

来自分类Dev

为什么我们需要在函数中的第二个参数之后初始化参数参数?

来自分类Dev

我们为什么需要容器?

来自分类Dev

为什么我们需要IO?

来自分类Dev

为什么我们需要在操作系统中进行地址虚拟化?

来自分类Dev

为什么我们需要在图灵的暂停证明中使用否定部分?

来自分类Dev

为什么我们需要在MSIL中显式调用父构造函数?

来自分类Dev

为什么我们需要在此脚本中调用“ c.set.bind(c)”?

来自分类Dev

为什么我们需要在Android应用中存储Goefence数据?

来自分类Dev

为什么我们需要在JavaScript中定义构造函数

来自分类Dev

为什么我们需要在getline(cin,string)之前使用cin.ignore()?

来自分类Dev

为什么我们需要在Kafka Consumer Configuration中添加所有Zookeeper节点

来自分类Dev

为什么我们需要在multiSVM方法中进行交叉验证以进行图像分类?

来自分类Dev

为什么我们需要在民意调查中调用poll_wait?

来自分类Dev

为什么我们需要在famo.us中使用TransitionableTransform类?

来自分类Dev

为什么我们需要在C中关闭文件?

来自分类Dev

为什么我们需要在休眠状态下刷新?

来自分类Dev

为什么需要在我们的应用程序中刷新数据库视图?

来自分类Dev

为什么我们需要在链接列表中填充数据?

来自分类Dev

我们为什么需要在vaadin的绑定中设置bean ** binder.setBean(object)**

来自分类Dev

为什么我们总是需要在Visual Studio中通过nuget安装efcore?

来自分类Dev

为什么我们需要在React Hook中返回一个函数?

来自分类Dev

为什么我们需要在Inno Setup中使用#expr指令?

来自分类Dev

为什么我们需要在Android应用中存储Goefence数据?

Related 相关文章

  1. 1

    为什么我们需要在ConnectionString中设置最小池大小

  2. 2

    为什么我们需要在ConnectionString中设置最小池大小

  3. 3

    为什么我们需要在Linux上挂载?

  4. 4

    为什么我们需要在Linux上挂载?

  5. 5

    什么时候以及为什么我们需要在bash上使用“ wait”命令?

  6. 6

    我们为什么要写窗口?

  7. 7

    为什么我们需要在函数中的第二个参数之后初始化参数参数?

  8. 8

    我们为什么需要容器?

  9. 9

    为什么我们需要IO?

  10. 10

    为什么我们需要在操作系统中进行地址虚拟化?

  11. 11

    为什么我们需要在图灵的暂停证明中使用否定部分?

  12. 12

    为什么我们需要在MSIL中显式调用父构造函数?

  13. 13

    为什么我们需要在此脚本中调用“ c.set.bind(c)”?

  14. 14

    为什么我们需要在Android应用中存储Goefence数据?

  15. 15

    为什么我们需要在JavaScript中定义构造函数

  16. 16

    为什么我们需要在getline(cin,string)之前使用cin.ignore()?

  17. 17

    为什么我们需要在Kafka Consumer Configuration中添加所有Zookeeper节点

  18. 18

    为什么我们需要在multiSVM方法中进行交叉验证以进行图像分类?

  19. 19

    为什么我们需要在民意调查中调用poll_wait?

  20. 20

    为什么我们需要在famo.us中使用TransitionableTransform类?

  21. 21

    为什么我们需要在C中关闭文件?

  22. 22

    为什么我们需要在休眠状态下刷新?

  23. 23

    为什么需要在我们的应用程序中刷新数据库视图?

  24. 24

    为什么我们需要在链接列表中填充数据?

  25. 25

    我们为什么需要在vaadin的绑定中设置bean ** binder.setBean(object)**

  26. 26

    为什么我们总是需要在Visual Studio中通过nuget安装efcore?

  27. 27

    为什么我们需要在React Hook中返回一个函数?

  28. 28

    为什么我们需要在Inno Setup中使用#expr指令?

  29. 29

    为什么我们需要在Android应用中存储Goefence数据?

热门标签

归档