使用 QOpenGLWidget 优于普通 QWidget 的好处

Posted

技术标签:

【中文标题】使用 QOpenGLWidget 优于普通 QWidget 的好处【英文标题】:Benefits of using QOpenGLWidget over normal QWidget 【发布时间】:2016-07-05 13:29:02 【问题描述】:

从 Qt 5.4 版本开始,引入了 QOpenGLWidget 来启用 OpenGL 渲染功能。

除了调用OpenGL API,QOpenGLWidget还可以作为一个普通的QWidget使用,其中使用了QPainter。

所以我想知道,如果我不打算直接调用任何 OpenGL API 来渲染我的小部件,而只调用 QPainter API,那么使用 QOpenGLWidget 而不是 QWidget 是否还有任何(可能是性能)优势?

【问题讨论】:

它可能有好处(我还没有看到使用“休闲”QPainter 并使用 OpenGL API 使用 QGLWidget 的高性能;但谁知道呢?)。但是,当您弄乱平台+硬件+驱动程序特定的事情时,您应该三思而后行。因为您的小部件在每台机器上的显示可能不同,它可能更快或更慢,具有旧驱动程序的旧机器可能会拒绝新的 OpenGL 功能,OpenGL 可能需要额外设置网络显示等。 所以实际上没有足够的动机使用 QOpenGLWidget,除非需要密集的 OpenGL 调用,对吧? QOpenGLWidget 的目的是在您的窗口内有一个矩形区域来渲染 OpenGL 场景。 QOpenGLWidget 只带来了开销,因为它需要是一个特定的带有窗口ID的资源,所以3D驱动和OS可以直接使用。 @Wayee 我看不出动机。也许有人会,不知道。但对我来说@Velkan 是对的,基本上QOpenGLWidget 是一个使用和显示OpenGL 场景的窗口。 【参考方案1】:

QOpenGLWidget,当直接使用QPainter 绘制时,使用 OpenGL 进行所有绘制 - 这是它的两个主要目的之一。在QOpenGLWidget 上使用QPainter 让Qt 完成了将painter API 转换为GL 状态设置和绘制调用的工作。如果您有一些 OpenGL 背景并使用 Qt 的调试版本,您可以追踪源代码并查看 Qt 如何转换您的调用,以便您可以以有效映射到 OpenGL 的方式发出您的画家调用。状态更改代价高昂,因此请确保您批处理使用相同笔/画笔等的操作。绘画由QOpenGL2PaintEngineEx 完成。

【讨论】:

以上是关于使用 QOpenGLWidget 优于普通 QWidget 的好处的主要内容,如果未能解决你的问题,请参考以下文章

如果我使用 BLAS/cuBLAS 使其性能优于普通 C/CUDA,矩阵应该有多大?

如何使用 QOpenGLWidget 渲染文本

无法使用 QOpenGLWidget 读取 GL_DEPTH_COMPONENT

没有子类化的 QOpenGLWidget

如何在 Android 上使用 QOpenGLWidget?

将 GLEW 与 QOpenGLWidget 一起使用