重新创建交换链与在调整大小时使用动态状态

Recreating swapchain vs using dynamic state on resize

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

在 window 调整大小事件发生后,vulkan 需要更新其可绘制区域。我已经看到了两种可能的方法。一种是重新创建交换链以及与之相关的所有其他对象,另一种是对视口使用动态状态,这样就不需要重新创建了。

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

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

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

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

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