使用 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 读取 GL_DEPTH_COMPONENT