Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
Windows 将多个OpenGL窗口同步到vsync_Windows_Multithreading_Opengl_Vsync - Fatal编程技术网

Windows 将多个OpenGL窗口同步到vsync

Windows 将多个OpenGL窗口同步到vsync,windows,multithreading,opengl,vsync,Windows,Multithreading,Opengl,Vsync,在Windows应用程序中,我同时打开了多个OpenGL窗口。理想情况下,我希望每一个都以60 fps的速度绘制,并与屏幕刷新同步 对于每个渲染上下文,我调用wglSwapIntervalEXT(1)以启用vsync。每个窗口都有自己的显示线程,它绘制框架,然后调用SwapBuffers进行更新 事实证明,这些窗口正在相互“争斗”:看起来好像SwapBuffers调用是同步的,并相互等待,即使它们在不同的线程中。我正在测量每个窗口的帧到帧时间,有两个窗口,这会下降到30 fps,有3到20 fp

在Windows应用程序中,我同时打开了多个OpenGL窗口。理想情况下,我希望每一个都以60 fps的速度绘制,并与屏幕刷新同步

对于每个渲染上下文,我调用
wglSwapIntervalEXT(1)
以启用vsync。每个窗口都有自己的显示线程,它绘制框架,然后调用
SwapBuffers
进行更新

事实证明,这些窗口正在相互“争斗”:看起来好像
SwapBuffers
调用是同步的,并相互等待,即使它们在不同的线程中。我正在测量每个窗口的帧到帧时间,有两个窗口,这会下降到30 fps,有3到20 fps,以此类推

如果我用wglSwapIntervalEXT(0)关闭vsync,无论我打开多少窗口,它们都会以60 fps的速度刷新。但在打开一个窗口的情况下,这并不像打开vsync时那样平滑


有什么方法可以用OpenGL实现我想要的功能吗?

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

在Linux中,由于从不同线程调用视频函数,我的应用程序出现了许多奇怪的行为


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

如果您考虑到这个问题,你会意识到,如果你将它们全部同步到刷新率,它们就必须彼此同步。您看到的每个窗口都没有唯一的刷新事件。我能想到的唯一解决方案(这几乎肯定是不可能的)是使用一个窗口,并使用视口在其中创建自己的窗口管理器。如果SwapBuffers只是发出需要交换缓冲区的信号,它可以立即返回(直到写入新的后缓冲区,这将需要阻止)。然后,显示驱动程序拥有的单独线程可以等待vsync,并在正确的时刻交换标记为需要交换的所有缓冲区。然而,显然这不是事情的工作方式……问题是我没有直接控制其他OpenGL窗口。