同步多个OpenGL窗口到垂直同步

9
在Windows应用程序中,我同时打开了多个OpenGL窗口。理想情况下,我希望每个窗口都以60 fps的速度绘制,并与屏幕刷新同步。
对于每个渲染上下文,我调用wglSwapIntervalEXT(1)来打开垂直同步。每个窗口都有自己的显示线程,它会绘制帧,然后调用SwapBuffers进行更新。
结果发现这些窗口“互相斗争”:看起来SwapBuffers调用是同步的,并等待彼此,即使它们在不同的线程中。我测量了每个窗口的帧间时间,当有两个窗口时,帧率降至30 fps,三个窗口时为20 fps,依此类推。
如果我使用wglSwapIntervalEXT(0)关闭垂直同步,则无论我打开多少个窗口,它们都可以愉快地以60 fps的速度刷新。但是,只有一个窗口打开时,与打开垂直同步相比,它并不那么流畅。
是否有任何方法可以在OpenGL中实现我想要的效果?

如果你思考这个问题,你会意识到如果你将它们全部同步到刷新率,它们必须相互同步。每个窗口都没有唯一的刷新事件。我能想到的唯一解决方案(几乎肯定是不可行的)是使用一个窗口,并在其中使用视口创建自己的窗口管理器。 - Robinson
如果SwapBuffers只是发出信号表示需要交换缓冲区,它就可以立即返回(直到新的后备缓冲区被写入,那才需要阻塞)。由显示驱动程序拥有的单独线程可以等待垂直同步并在正确时刻交换所有标记为需要交换的缓冲区。然而,显然事情并不是这样运作的... - Frederik Slijkerman
2个回答

1
在Linux中,由于从各种线程调用视频函数,我的应用程序出现了许多奇怪的行为。我通过仅使用一个线程进行显示解决了这些问题,自应用程序启动以来,创建窗口、创建glcontext等,并使用信号量和队列在该线程和其他线程之间共享数据。

0

你可以获取输出设备并在线程中使用WaitForVBlank函数进行循环。然后,可以为每个感兴趣的窗口发布消息或信号事件。


问题在于我无法直接控制其他的OpenGL窗口。 - Frederik Slijkerman

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