QWidget 和 QOpenGLWidget 结合时的性能问题

问题描述 投票:0回答:1

我开发一个应用程序,我需要在主窗口中将一个QOpenGLWidget与多个QWidget组合在一起。

当任何 QWidget 对象需要重绘时,性能问题就会显现出来。当突然发生重画时,帧速率会下降。

分析器图像

我分析了该应用程序,似乎每次 QWidet 重绘时,为了将 QOpenGLWidget 与其他 QWidget 合并,Qt 都需要做一些工作。因此它最终调用

QPlatformGraphicsBufferHelper::bindSWToTexture
函数,需要 6 到 9 毫秒(请参见分析器图像),这对于 60 fps 应用程序来说非常昂贵。

我认为对于这种情况有一些最佳实践和规则,但我没有找到。

任何人都可以解释问题的实际根源是什么以及在窗口中使用 QOpenGLWidget 和 QWidget 而不出现性能问题的正确方法。

我在linux中的Qt 5.15.2和5.14.2中测试了它。

谢谢。

c++ qt qwidget qopenglwidget
1个回答
0
投票

正如所料。包含

QWindow
的整个
QOpenGLWidget
是用 OpenGL 绘制的。因此,每次该窗口中的任何
QWidget
重新绘制像素图时,其图像都会作为新纹理上传到 GPU。这是需要的,以便将小部件的纹理组合到窗口的整个图片中。将纹理上传到 GPU 需要一些时间。

当使用

QOpenGLWidget
构建的性能不足时,通常的做法是不使用它,而是使用
QOpenGLWindow
。请注意,该链接指向 Qt 6 文档,但一直如此。它“不依赖于小部件模块并提供更好的性能”。

我们自己绘制该窗口中显示的信息,并且不使用小部件。

© www.soinside.com 2019 - 2024. All rights reserved.