首页 > 解决方案 > 重新创建交换链与在调整大小时使用动态状态

问题描述

我有一个使用 GLFW 作为其窗口管理器的 vulkan 应用程序。

在窗口调整大小事件时,vulkan 需要更新其可绘制区域。我已经看到了两种可能的方法。一种是与绑定到它的所有其他对象一起重新创建交换链,另一种是对视口使用动态状态,这样就不需要重新创建。

这两者有什么区别,我什么时候应该更喜欢其中一个?

标签: c++graphicsglfwvulkan

解决方案


如果窗口被调整为更小的尺寸,显示引擎可能不会强制您更改交换链图像大小。它可能会通过VK_SUBOPTIMAL_KHR错误代码通知您(尽管即使呈现性能不受影响,它也可能不会告诉您)。但是,如果将窗口大小调整为更大,则显示引擎可能会抛出VK_ERROR_OUT_OF_DATE_KHR. 这不是你可以忽略的。它也不是显示引擎可以承诺永远不会给你的东西。

这意味着您的代码必须能够进行交换链重建。由于无论如何您都必须考虑到这一点,唯一的问题是您是在调整窗口大小时还是仅在显示引擎强制您这样做时才这样做。

我想说的是,如果显示引擎没有让你重建交换链,那么不这样做可能会更快。使用动态状态并不比管道状态特别慢,而且它不像你要在中间帧中改变它。事实上,您不应该仅仅因为交换链被调整大小而重建所有管道,因此无论如何您都应该为视口使用动态状态。

简而言之:你应该两者都做。


推荐阅读