我在同一个主线程中使用三个不同的QGLWidgets,最好以60fps渲染,但我不能实现超过20fps。这似乎是由垂直同步引起的,因为每个小部件可能试图独立地与刷新率同步,因此它们以某种方式锁定。如果我只使用两个小部件,我可以达到30fps。或者,如果我将一个小部件的更新速率固定为10fps,那么我将在其他小部件上达到25fps(10+25+25=60)。swapInterval()
总是返回0,与我用setSwapInterval(int)
设置的值无关。什么好主意吗?我可以禁用垂直同步吗?或者问题可能是由其他原因引起的?
似乎这是目前Qt 5.0的错误- https://bugreports.qt.io/browse/QTBUG-29073
关闭垂直同步将解决在QGLWidgets之间划分更新速率的问题,您的显卡将按照您告诉它的速度或尽可能快地渲染到屏幕。但是你必须在显卡设置中禁用垂直同步。仅设置fmt.setSwapInterval(0)将不起任何作用。
不幸的是,另一个问题出现了,如果你正在绘制包含水平移动的视频,将出现撕裂。
希望Qt 5.3能修复这个错误。
对于那些仍然在这个问题上挣扎的人,我的简短回答是:在尝试其他任何事情之前:安装Qt 5.4。
长答:
我从来没有任何问题禁用VSync与Qt 4.8。
使用Qt 5.3.1(在Kubuntu 14.04 64位),我从来没有能够强迫我的QGLWidget 不在VBlank同步,这意味着swapBuffers()无论如何都是阻塞的。我在"桌面效果"面板和NVidia控制面板中禁用了垂直同步,并设置了swapinterval(0),但无济于事。因此,我的fps总是被限制在60fps/nummofqglwidget(除非我使用SingleBuffering,但在我的应用程序中闪烁是不可容忍的)。使用多线程,理论上应该可以启用VSync(因此没有撕裂),并为多个QGLWidget实现60fps,但我未能使其工作良好。
今天,我刚刚安装了Qt 5.4,它神奇地解决了这个问题:我可以成功地拥有一个非阻塞的swapBuffers(),就像我以前在Qt 4.8中使用的那样。我认为Qt 5.3强制垂直同步无论你的驱动设置是什么。但在Qt 5.4中不再是这种情况,至少在我的配置中是这样。Qt团队似乎做了很多工作来改进Qt 5.4的OpenGL(值得注意的是,他们引入了QOpenGLWidget类),所以我对那些在Qt中使用OpenGL的人的建议是更新到Qt 5.4,它可能会让你的生活更轻松。