在 Windows 应用程序中,我同时打开了多个 OpenGL 窗口。理想情况下,我希望每一个都以 60 fps 的速度绘制,并与屏幕刷新同步。
对于每个渲染上下文,我调用 wglSwapIntervalEXT(1)
来打开垂直同步。每个窗口都有自己的显示线程,绘制框架,然后调用 SwapBuffers
进行更新。
事实证明,这些窗口正在相互“争斗”:看起来 SwapBuffers
调用是同步的并相互等待,即使它们在不同的线程中也是如此。我正在测量每个窗口的帧到帧时间,有两个窗口时,这个时间下降到 30 fps,有 3 到 20 fps,等等。
如果我使用 wglSwapIntervalEXT(0)
关闭垂直同步,无论我打开多少个窗口,它们都会以 60 fps 的速度愉快地刷新。但是在打开一个窗口的情况下,这远不如打开 vsync 时那么流畅。
有什么方法可以用 OpenGL 完成我想要的吗?
最佳答案
在 Linux 中,由于从不同的线程调用视频函数,我的应用程序出现了很多奇怪的行为。
我解决了这些问题,在应用程序启动后使用一个线程仅用于显示、创建窗口、创建 glcontext 等,并使用信号量和队列在该线程与其他线程之间共享数据。
关于windows - 将多个 OpenGL 窗口同步到 vsync,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10043745/