将多个OpenGL窗口同步到vsync

时间:2012-04-06 12:52:38

标签: windows multithreading opengl vsync

在Windows应用程序中,我同时打开了多个OpenGL窗口。理想情况下,我希望每个以60 fps的速度绘制,与屏幕刷新同步。

对于每个渲染上下文,我正在调用wglSwapIntervalEXT(1)来打开vsync。每个窗口都有自己的显示线程,用于绘制帧,然后调用SwapBuffers进行更新。

事实证明,窗口彼此“战斗”:看起来SwapBuffers调用是同步的并且彼此等待,即使它们在不同的线程中。我正在测量每个窗口的帧到帧时间,并且有两个窗口,这下降到30 fps,有3到20 fps等。

如果我使用wglSwapIntervalEXT(0)关闭vsync,无论我打开多少个窗口,他们都会以60 fps快速刷新。但是打开一个窗口,这并不像打开vsync那样顺畅。

有没有办法用OpenGL完成我想要的东西?

2 个答案:

答案 0 :(得分:1)

在Linux中,由于从各种线程调用视频函数,我的应用程序出现了很多奇怪的行为。

我使用一个线程来解决这些问题,因为应用程序启动,创建窗口,创建glcontext等,并使用信号量和队列在此线程和其他线程之间共享数据。

答案 1 :(得分:0)

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