9

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

对于每个渲染上下文,我都会调用wglSwapIntervalEXT(1)以打开 vsync。每个窗口都有自己的显示线程,它绘制框架然后调用SwapBuffers更新。

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

如果我用 关闭垂直同步wglSwapIntervalEXT(0),无论我打开多少个窗口,它们都会愉快地以 60 fps 刷新。但是在打开一个窗口的情况下,这并不像打开 vsync 那样平滑。

有什么方法可以用 OpenGL 完成我想要的吗?

4

2 回答 2

1

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

我解决了这些问题,自应用程序启动以来仅使用一个线程进行显示,创建窗口,创建 glcontext 等,并使用信号量和队列在该线程和其他线程之间共享数据。

于 2016-10-12T16:52:28.367 回答
0

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

于 2012-05-06T17:38:46.343 回答