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

Bal*_*lgy 3 c++ graphics glfw vulkan

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

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

这两者之间有什么区别?我什么时候应该选择其中之一?

Nic*_*las 6

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

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

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

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