【发布时间】:2012-04-20 02:05:07
【问题描述】:
在 Windows 应用程序中,我同时打开了多个 OpenGL 窗口。理想情况下,我希望每一个都以 60 fps 的速度绘制,与屏幕刷新同步。
对于每个渲染上下文,我调用wglSwapIntervalEXT(1) 来打开垂直同步。每个窗口都有自己的显示线程,绘制框架然后调用SwapBuffers进行更新。
事实证明,这些窗口正在相互“战斗”:看起来SwapBuffers 调用是同步的并相互等待,即使它们位于不同的线程中。我正在测量每个窗口的帧到帧时间,并且有两个窗口,这下降到 30 fps,3 到 20 fps,等等。
如果我用wglSwapIntervalEXT(0) 关闭垂直同步,无论我打开多少个窗口,它们都会愉快地以 60 fps 刷新。但是打开一个窗口,这并不像打开 vsync 那样流畅。
有什么方法可以用 OpenGL 完成我想要的吗?
【问题讨论】:
-
如果您考虑这个问题,您会意识到如果您将它们全部同步到刷新率,它们必须相互同步。您看到的每个窗口都没有唯一的刷新事件。我能想到的唯一解决方案(几乎可以肯定这不是首发)是使用一个窗口并使用视口在其中创建自己的窗口管理器。
-
如果 SwapBuffers 只是发出需要交换缓冲区的信号,它可以立即返回(直到写入新的后台缓冲区,这需要阻塞)。然后,显示驱动程序拥有的单独线程可以等待 vsync 并在正确的时刻交换所有标记为需要交换的缓冲区。然而,显然这不是事情的运作方式......
标签: windows multithreading opengl vsync