c++ - 重新创建交换链与在调整大小时使用动态状态
问题描述
我有一个使用 GLFW 作为其窗口管理器的 vulkan 应用程序。
在窗口调整大小事件时,vulkan 需要更新其可绘制区域。我已经看到了两种可能的方法。一种是与绑定到它的所有其他对象一起重新创建交换链,另一种是对视口使用动态状态,这样就不需要重新创建。
这两者有什么区别,我什么时候应该更喜欢其中一个?
解决方案
如果窗口被调整为更小的尺寸,显示引擎可能不会强制您更改交换链图像大小。它可能会通过VK_SUBOPTIMAL_KHR
错误代码通知您(尽管即使呈现性能不受影响,它也可能不会告诉您)。但是,如果将窗口大小调整为更大,则显示引擎可能会抛出VK_ERROR_OUT_OF_DATE_KHR
. 这不是你可以忽略的。它也不是显示引擎可以承诺永远不会给你的东西。
这意味着您的代码必须能够进行交换链重建。由于无论如何您都必须考虑到这一点,唯一的问题是您是在调整窗口大小时还是仅在显示引擎强制您这样做时才这样做。
我想说的是,如果显示引擎没有让你重建交换链,那么不这样做可能会更快。使用动态状态并不比管道状态特别慢,而且它不像你要在中间帧中改变它。事实上,您不应该仅仅因为交换链被调整大小而重建所有管道,因此无论如何您都应该为视口使用动态状态。
简而言之:你应该两者都做。
推荐阅读
- c# - 使用 .NET 中的 Adobe PDF Tool API 将 PDF 转换为 Excel
- node.js - Discord.js guildCreate/guildDelete 事件似乎不起作用
- angular - 以 Angular 反应形式显示多个送货地址
- dpdk - DPDK 流过滤器获取无效操作错误
- c# - 我有一个组合框,它加载另一个组合框中的另一个值,但第二个组合框的值总是坚持第一次加载的值
- python - 在现有 Python 包中安装 Python 包
- reactjs - 尽管未设置依赖关系,为什么 useEffect 仍在执行?
- c++ - C++字符串类实现
- mysql - 如何回滚在 Magento 2 的 Porto 主题中设置面板上定义的自定义 CSS 和其他设置?
- github - 带有 AWS EC2 CodeDeploy 的 Github