如何在Vulkan中限制帧率

6
我知道当前的交换链模式可以用来将帧率与屏幕刷新率同步(例如使用VK_PRESENT_MODE_FIFO_KHR)。
但是有没有一种方法可以将帧率限制为显示器刷新率的一部分?(例如,我希望我的应用程序以30 FPS运行而不是60 FPS。)
换句话说,有没有一种方法来模拟OpenGL中wglSwapIntervalEXT(2)的功能?

在显示器可以动态改变刷新率的世界中,这并没有太多意义。 - krOoze
所有的显示器都能做到这一点吗?我可以通过编程选择刷新率吗?如果不能,那么在我的使用情况中这是有道理的。 - Jerem
很抱歉,目前还不能通过Vulkan实现。目前的设计方式是由您来控制时间。也就是说,不要呈现您不想立即显示的内容。如果您有60 Hz的显示器,使用它可能是有意义的——例如,似乎插入一个黑帧比显示相同的图像两次更有益。 - krOoze
1
从Vulkan API的角度来看,没有办法做到那一点。但是您可以自己实现 - 让CPU忙碌到足以使帧生成时间超过17毫秒。如果在此期间呈现交换链图像,则FIFO模式将以每秒30次的速度在屏幕上显示它们。 - Ekzuzy
1个回答

5

Vulkan是一种低级API,它试图为您提供构建所需功能所需的工具。

因此,当您呈现图像时,API假定您希望尽快呈现图像(在交换链的限制范围内)。如果您想延迟呈现,则需要延迟呈现。也就是说,在基于您自己的CPU计时的时间接近呈现新图像的时间之前,您不会呈现该图像。


有没有一种方法可以知道发生了多少个垂直空白或者何时发生的?我可能可以通过时间管理来解决,但是要获取交换间隔的确切行为,垂直空白信息会很棒。 - Jerem
1
@Jerem:Vulkan没有询问这些问题的机制。但是,您不需要这样做;如果您想将FPS限制为30,则可以使用CPU计时器,在该时间段内阻止自己渲染/呈现新帧。 - Nicol Bolas
1
@Jerem 目前还没有。我认为这里 https://github.com/KhronosGroup/Vulkan-Docs/issues/370 与此相关。 - krOoze
2
从技术上讲,确实有 VK_EXT_display_surface_counter 扩展,但规范暗示它可能只针对 display_swapchain,而且 Vulkan HW DB 显示没有支持。或者是 VK_GOOGLE_display_timing,但仅有有限的支持(只在一些 Android 上)。 - krOoze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接