我开发一个应用程序,我需要在主窗口中将一个QOpenGLWidget与多个QWidget组合在一起。
当任何 QWidget 对象需要重绘时,性能问题就会显现出来。当突然发生重画时,帧速率会下降。
我分析了该应用程序,似乎每次 QWidet 重绘时,为了将 QOpenGLWidget 与其他 QWidget 合并,Qt 都需要做一些工作。因此它最终调用
QPlatformGraphicsBufferHelper::bindSWToTexture
函数,需要 6 到 9 毫秒(请参见分析器图像),这对于 60 fps 应用程序来说非常昂贵。
我认为对于这种情况有一些最佳实践和规则,但我没有找到。
任何人都可以解释问题的实际根源是什么以及在窗口中使用 QOpenGLWidget 和 QWidget 而不出现性能问题的正确方法。
我在linux中的Qt 5.15.2和5.14.2中测试了它。
谢谢。
正如所料。包含
QWindow
的整个 QOpenGLWidget
是用 OpenGL 绘制的。因此,每次该窗口中的任何 QWidget
重新绘制像素图时,其图像都会作为新纹理上传到 GPU。这是需要的,以便将小部件的纹理组合到窗口的整个图片中。将纹理上传到 GPU 需要一些时间。
当使用
QOpenGLWidget
构建的性能不足时,通常的做法是不使用它,而是使用QOpenGLWindow
。请注意,该链接指向 Qt 6 文档,但一直如此。它“不依赖于小部件模块并提供更好的性能”。
我们自己绘制该窗口中显示的信息,并且不使用小部件。