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