交换缓冲区同步

时间:2013-09-17 15:51:15

标签: opengl x11 swap doublebuffered glx

我在一个显示系统上有四个窗口,每个窗口都有自己的上下文和自己的drawable(保存其中两个是其他的子项)。我希望同步交换这些窗口的缓冲区同时执行的过程。快速搜索使我有了这些可能的替代方案。

  • GLX_SGIX_swap_group:仅适用于X11系统。
  • NV_swap_groupWGL_NV_swap_group / GLX_NV_swap_group):仅适用于支持帧锁的Quadro GPU。
  • GLX_OML_sync_control:使用vsync和swap提供的计数器提供同步控制,但可能需要更多调整才能实现一个用于组交换。也没有NV和fglrx系统(?)但是它确实支持窗口和X11系统。

每个人似乎都有自己的限制,特别是在硬件支持方面。我已经读过软件交换同步也是可行的,比如均衡器中提供的交换屏障?是否有可能指出如何实现?或者,如果有替代方案,我可能会被重定向到?

2 个答案:

答案 0 :(得分:0)

一种可能的解决方案是打开所有窗口等待VBlank(这假设所有窗口都在相同或同步的显示器上)并手动同步SwapBuffer调用。这种方法不是100%防水(因为缓冲交换命令可能发出非常接近实际帧“siwtch”,并且一些线程完成它而其他一些错过它,但这是非常不可能的,只是暂时的故障,如“迟到”线程将延迟最后一帧中的“早期”线程并恢复同步。

要实现这一点,您可以使用一些简单的障碍。只是不要忘记手动刷新GL管道,这样才能完成工作,并且可以立即执行SwapBuffers。所有每个线程必须在帧的末尾处glFinish()并等待屏障。一旦所有线程到达障碍,他们立即发出SwapBuffers()

答案 1 :(得分:0)

如果只有一个窗口是可以接受的,则可以使用单独的视口来渲染每个视图。例如:

glClear(...);

glViewport(x1, y1, width1, height1); // all coordinates are in pixels
// draw scene 1

glViewport(x2, y2, width2, height2);
// draw scene 2

glViewport(x3, y3, width3, height3);
// draw scene 3

SwapBuffers(...); // actual method depends on your environment