在Windows应用程序中,我有多个OpenGL窗口同时打开。 理想情况下,我希望每个都以60 fps进行绘制,同步到屏幕刷新。
对于每个渲染上下文,我调用wglSwapIntervalEXT(1)
打开wglSwapIntervalEXT(1)
。 每个窗口都有自己的显示线程,它绘制框架,然后调用SwapBuffers
进行更新。
事实certificate,这些窗口正在相互“搏斗”:看起来SwapBuffers
调用是同步的,并且彼此等待,即使它们在不同的线程中。 我正在测量每个窗口的帧到帧时间和两个窗口,这将下降到30 fps,三到20 fps等。
如果我使用wglSwapIntervalEXT(0)
closureswglSwapIntervalEXT(0)
,无论打开多less个窗口,都可以以60 fps的速度快速刷新。 但是打开一个窗口,这并不像打开vsync那样顺畅。
有没有办法用OpenGL来实现我想要的?
您可能能够获得输出设备,并在线程的循环中使用WaitForVBlank函数。 然后,您可以为每个感兴趣的窗口发布消息或信号事件。
在Linux中,由于从各个线程调用视频函数,我的应用程序出现了很多奇怪的行为。
我使用一个线程解决了这些问题,从应用程序的开始,创建窗口,创建glcontext等,以及使用信号量和队列来共享这个线程和其他线程之间的数据。