Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C WinAPI-同步交换缓冲区_C_Multithreading_Winapi_Opengl - Fatal编程技术网

C WinAPI-同步交换缓冲区

C WinAPI-同步交换缓冲区,c,multithreading,winapi,opengl,C,Multithreading,Winapi,Opengl,可以在多个线程中同步交换缓冲区吗?当我尝试打开垂直同步(wglSwapIntervalEXT)时,它会停止所有线程,直到它不勾选为止(例如,当我打开3个窗口时,每个窗口大约有20帧[60/3]) 每个窗口都有单独的线程,当然每个线程都有自己的SwapBuffer函数。为什么不在调用SwapBuffers之前/之后添加一个呢?在WGL中,每个窗口的Swap控件都是(设置它时,它将应用于当前渲染上下文绑定的窗口)。渲染上下文和窗口之间的关联绑定到设备上下文(请参见)。如果每一个窗口都可靠地达到了,剩

可以在多个线程中同步交换缓冲区吗?当我尝试打开垂直同步(wglSwapIntervalEXT)时,它会停止所有线程,直到它不勾选为止(例如,当我打开3个窗口时,每个窗口大约有20帧[60/3]) 每个窗口都有单独的线程,当然每个线程都有自己的SwapBuffer函数。

为什么不在调用
SwapBuffers
之前/之后添加一个呢?

在WGL中,每个窗口的Swap控件都是(设置它时,它将应用于当前渲染上下文绑定的窗口)。渲染上下文和窗口之间的关联绑定到设备上下文(请参见)。如果每一个窗口都可靠地达到了<~5.6毫秒的帧时间,那么您可能只需要为三个窗口中的一个窗口使用VSYNC

你应该考虑的是有一个上下文将交换间隔设置为<强> 1 < /强>,剩下的2使用<强> 0 < /强>。同步到VBLANK(交换间隔=1)的上下文将引导其他两个线程。也就是说,让其他两个线程调用

glFlush(…)
,然后在调用
SwapBuffers(…)
之前等待直到第一个线程停止对VSYNC的阻塞。使用
glFlush(…)
的原因是,在等待第一次(同步)交换完成时,其他两个线程可以完成一些有用的渲染任务

这听起来很有趣——几乎像是撕裂的秘方——但鉴于WindowsVista/7/8的合成窗口管理器的性质,VSYNC实际上不再阻止撕裂。窗口管理器本身通过异步合成来实现这一点,它可以有效地执行三重缓冲。然而,VSYNC允许您(正确完成后)在每次刷新时让所有3个窗口更新其内容(避免延迟帧)


如果在VBLAST开始时没有麻烦启动一系列缓冲掉期,那么您可能会遇到这样一种情况,即复合窗口管理器显示2帧的旧帧,因为您在VBLAST中间交换缓冲区。诚然,如果你画了一个过长的帧,你仍然会遇到这种情况,但它解决了短帧被不幸地交换到离垂直回溯截止日期太近而无法及时完成的情况。

如何在C中通过定时器实现这一障碍?Google随后提供了一个实现。