1

我在一个显示系统上有四个窗口,每个窗口都有自己的上下文和自己的可绘制对象(除了其中两个是另一个的孩子)。我希望同步交换同时执行的这些窗口的缓冲区的过程。快速搜索为我提供了这些可能的替代方案。

  • GLX_SGIX_swap_group: 仅适用于 X11 系统。
  • NV_swap_group( WGL_NV_swap_group/ GLX_NV_swap_group) :仅在支持帧锁定的 Quadro GPU 上可用。
  • GLX_OML_sync_control:通过 vsync 和 swap 上提供的计数器提供同步控制,但可能需要更多调整才能实现组交换。也不可用 NV 和 fglrx 系统(?)但确实支持 windows 和 X11 系统。

每个似乎都有自己的局限性,尤其是在硬件支持方面。我读过软件交换同步也是可行的,比如均衡器中提供的交换屏障?是否有可能有一个关于如何实施的指针?或者,如果有其他选择,我可能会被重定向到?

4

2 回答 2

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
于 2013-09-17T19:49:34.470 回答
0

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

要实现这一点,您可以使用一些简单的屏障。只是不要忘记手动刷新 GL 管道,以便真正完成工作并且可以立即执行 SwapBuffers。每个线程在帧结束时所要做的就是glFinish()等待屏障。一旦所有线程到达屏障,它们立即发出一个SwapBuffers().

于 2013-09-17T19:00:06.827 回答