微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

让我们直接获取swapchain的图像计数

如何解决让我们直接获取swapchain的图像计数

熟悉有关Vulkan的大量书籍,教程和文档后,我仍然对交换链图像计数的工作方式感到困惑。

有关交换链图像计数的文档:

VkSwapchainCreateInfoKHR::minImageCount应用程序所需的可呈现图像的最小数量。该实现将创建至少包含这么多图像的交换链,否则将无法创建交换链。

在阅读了此字段的描述之后,我的理解是,如果我将创建交换链,其中交换链的minImageCount值大于或等于VkSurfaceCapabilitiesKHR::minImageCount而小于或等于VkSurfaceCapabilitiesKHR::maxImageCount,那么我将能够获取minImageCount图像,因为它是应用程序所需的图像数量

我们假设以下值:

VkSurfaceCapabilitiesKHR::minImageCount == 2

VkSurfaceCapabilitiesKHR::maxImageCount == 8

VkSwapchainCreateInfoKHR::minImageCount == 3

在这种情况下,我希望能够从交换链中获取3张图像,比方说,一张指定要显示,一张等待显示,另一张用于绘制(就像在三重缓冲情况下一样)。

另一方面,许多教程建议将VkSwapchainCreateInfoKHR::minImageCount的值设置为VkSwapchainCreateInfoKHR::minImageCount + 1,这说明并非交换链中创建的所有图像都被指定为由应用程序获取,因为其中某些图像可能会被应用程序使用。内部驱动程序。

示例:Discussion

关于如何选择交换链中的图像数量,以便应用程序不会被迫等待图像获取,是否有可靠的解释?

解决方法

最终,图像呈现的细节不在您的控制范围内。要求更多图像可能会减少遇到CPU阻塞情况的可能性,但是没有计数或其他参数可以保证它不会发生。使用更多交换链图像只会使其可能性降低。

但是,只需查看vkAcquireNextImageKHR在超时为0时的行为,就可以轻松判断何时发生阻塞。如果返回{{1}},则无法获取任何图像,那么您就需要等待。这使您有机会决定如何处理此信息。

当发生这种情况时,您可以注意到它发生了。如果它发生得足够频繁,则可能值得重新创建带有更多图像的交换链集。显然,这不是一个轻量级的解决方案,但是在硬件上将是中立的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。