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