【问题标题】:Synchronizing multiple OpenGL windows to vsync将多个 OpenGL 窗口同步到 vsync
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 问题是我没有直接控制其他OpenGL窗口。
    猜你喜欢
    • 2015-06-19
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多