QT - 如何正确处理Vsync和多个QGLWidgets

时间:2014-03-25 13:37:14

标签: qt opengl qglwidget vsync

我在同一主线程中使用三个不同的QGLWidgets,最好以60fps渲染,但是我不能达到20fps以上。这似乎是由Vsync引起的,因为每个小部件可能会尝试独立地与刷新率同步,因此它们以某种方式锁定。如果我只使用两个小部件,我会达到30fps。或者,如果我将一个小部件的更新速率设置为10fps,那么我就会达到25fps(10 + 25 + 25 = 60)。 swapInterval()始终返回0,与我使用setSwapInterval(int)设置的值无关。有任何想法吗?我可以禁用Vsync吗?或者问题可能是由不同的东西造成的?

2 个答案:

答案 0 :(得分:3)

它似乎是目前来自Qt 5.0的错误 - https://bugreports.qt.io/browse/QTBUG-29073

关闭Vsync将解决QGLWidgets之间的更新速率划分问题,您的显卡将以尽可能快的速度渲染到屏幕或尽可能快。但您必须在显卡设置中禁用VSync。只设置fmt.setSwapInterval(0)将不执行任何操作。

不幸的是,另一个问题是,如果你正在绘制包含水平移动的视频,则会出现撕裂。

希望Qt 5.3能解决这个问题。

答案 1 :(得分:2)

对于那些仍在努力解决这个问题的人,我的简短回答是:在尝试其他任何事情之前:安装Qt 5.4。

更长的答案:

我从来没有遇到过用Qt 4.8禁用VSync的任何问题。

使用Qt 5.3.1(在Kubuntu 14.04 64bit中),我从来没有能够强制我的QGLWidget 不要在VBlank同步,这意味着无论如何,swapBuffers()都会阻塞。我在"桌面效果"中禁用了VSync。面板和NVidia控制面板,以及setSwapInterval(0)无济于事。因此我的fps一直被限制在60fps / numOfQGLWidget(除非我使用SingleBuffering,但在我的应用程序中不能容忍闪烁)。使用多线程,理论上应该可以启用VSync(因此不会撕裂),并且可以为多个QGLWidget实现60fps,但是我没能使用它。

今天,我刚刚安装了Qt 5.4,它神奇地解决了这个问题:我可以成功地拥有一个非阻塞的swapBuffers(),就像我在Qt 4.8中所做的那样。我认为无论你的驱动程序设置如何,Qt 5.3都会以某种方式强制VSync。但至少在我的配置中,Qt 5.4已不再是这种情况了。似乎Qt团队为Qt 5.4做了很多改进OpenGL的工作(特别是他们引入了QOpenGLWidget类),所以我对使用OpenGL和Qt的任何人的建议是对Qt 5.4进行更新,它可能会让你的生活更轻松。