是否可以在多个线程中同步SwapBuffers?当我试图打开垂直同步(wglSwapIntervalEXT)时,它会停止所有线程,直到它不再运行(例如)。当我打开3个窗口时,每个窗口大约有20帧60/3 )每个窗口都有单独的线程,当然每个线程都有自己的SwapBuffer函数。
发布于 2014-06-02 18:42:40
交换控制是WGL中的每个窗口的(当您设置它时,它将应用于当前呈现上下文所绑定的窗口)。呈现上下文和窗口之间的关联绑定到设备上下文(请参见wglMakeCurrent (...))。如果您在每个窗口中可靠地达到< ~5.6 ms帧时间,那么您可能只需要对3个窗口中的一个窗口进行VSYNC。
您应该考虑的是,您的上下文之一将交换间隔设置为1,其余2使用。与VBLANK同步的上下文(交换间隔= 1)将导致其他两个线程。也就是说,让其他两个线程调用glFlush (...),然后繁忙等待,直到第一个线程在调用SwapBuffers (...)之前停止对SwapBuffers (...)的阻塞。glFlush (...)的原因是,在等待第一个(同步)交换完成时,其他两个线程可以完成一些有用的呈现任务。
这听起来很有趣--几乎就像撕裂的处方--但是考虑到Windows /7/8组合窗口管理器的本质,VSYNC实际上不再阻止撕裂了。窗口管理器本身通过异步组合来实现这一点,它有效地执行三重缓冲。然而,VSYNC允许您做的(如果正确的话)是让您的所有3个窗口更新他们的内容每次刷新(避免晚帧)。
如果您没有费心在VBLANK开头启动一系列缓冲区交换,那么您可能会遇到这样的情况,即组合窗口管理器会显示2帧的旧框架,因为您正在VBLANK中间交换缓冲区。当然,如果绘制过长的帧,您仍然会遇到这种情况,但它解决了短帧不幸地在垂直回溯截止日期附近被交换而无法及时完成的情况。
发布于 2014-06-02 14:15:04
为什么不直接在调用阻隔之前/之后添加一个SwapBuffers
https://stackoverflow.com/questions/23996057
复制相似问题