【问题标题】:qt performance – OpenGLqt 性能 – OpenGL
【发布时间】:2011-08-03 18:52:18
【问题描述】:

我不想在我的小部件(QPainter)的绘制功能中使用 Native OpenGL,以提高性能。 我看到有函数 QPainter::begin/endNativePainting(),可以帮助我。 但我找不到这方面的例子...... 我想知道这些功能是否成本低廉,或者每次使用它们会降低性能? 2.我能否定义 beginNativePainting() 和 endNativePainting(),一般用于我使用的所有小部件,而不是在我拥有的每个绘制函数中使用它。

tnx 寻求帮助....

【问题讨论】:

    标签: qt qt4 embedded-linux


    【解决方案1】:

    文档中有一些基本示例代码:http://doc.qt.io/qt-4.8/qpainter.html#beginNativePainting

    函数本身的成本应该相当低,但调用它们可能仍会导致明显的开销,因为 Qt 必须在 beginNativePainting() 调用上刷新其内部绘制队列,并且可能必须假设一切都在endNativePainting() 被调用。

    对于第二部分,我不确定我是否理解您的目标。基本上如果你有一个 QPainter 对象,你可以调用一次beginNativePainting()。但是您必须将其与endNativePainting() 调用相匹配。所以通常的地方是paint()方法。

    【讨论】:

    • 我看到了这个例子,但是没有使用它的程序(在 qt 示例/演示/诺基亚论坛中)......我想知道它是否真的有用,或者还有其他方法可以做所以。 2. 如果我打算将它用于应用程序中的许多小部件,我可以将 beginNativePainting() 放在 QWidget 的 ctor 中...而将 endNativePainting() 放在 th dtor 中? .....当我有很多小部件时它真的有用吗?
    • Qt 框架为您提供了一个 QPainter 作为 QWidget 的 paintEvent() 方法的参数。使用 begin/endNativePainting() 仅在此方法内有意义(只要 QPainter 存在)。因此,您不能简单地在 ctor 中调用 beginNativePainting()(在什么方面?)如果您不确定自己在做什么,我建议您只使用 QPainter 进行绘画并忽略 begin/endNativePainting()。仅当您遇到无法使用 Qt 的 API 解决的问题时,才可能是重新考虑的时候。 (如果你只想使用 OpenGL,你可能想看看 Qt 的图形系统。)
    • 我必须使用 opengl 来提高性能......我不知道在不更改我的小部件代码中的很多部分的情况下最好的方法是什么。
    • 所以你现在根本没有使用 OpenGL?然后 begin/endNativePainting() 使用本机 OpenGL 调用无论如何都不起作用。尝试使用“-graphicssystem opengl”作为(附加)命令行参数运行您的应用程序。这会将 Qt 的默认渲染后端切换到 OpenGL,无需更改您的代码。如果这有效并且明显(或至少可测量)更快,您可以更改应用程序初始化以使用 QApplication::setGraphicsSystem("opengl") 之类的设置默认后端,请参阅doc.trolltech.com/4.7/qapplication.html#setGraphicsSystem
    • 我使用这个,但我得到了错误:QGLFramebufferObject:Framebuffer 不完整的附件。无法创建大小为 QSize(158, 17) 的像素图纹理缓冲区,回退到光栅绘制引擎
    【解决方案2】:

    Qt 正在使用一系列 OpenGL 功能来实现其 2D 绘画,包括自定义着色器和各种帧缓冲区。它使 OpenGL 处于非常混乱的状态。

    beginNativePainting / endNativePainting 允许 Qt 的绘图引擎保存此上下文并在用户完成绘图后检索它。

    如果让xxxNativePainting 方法做相反的事情(即自动保存和恢复 OpenGL 的用户配置)会很好,但由于 Qt 允许直接调用 OpenGL 基元,如果没有大量的保存全局状态几乎是不可能的代码和潜在的严重性能损失。

    相反,这些方法只是保存 Qt 的内部 OpenGL 状态,而不是让用户代码以无论如何都没有意义的配置启动(并且可能随着每个新 Qt 版本而改变),而是将 OpenGL 重置为“中性”状态。
    这意味着,在开始/结束部分中,您将从一个干净的状态开始:没有链接着色器、没有顶点数组、大部分全局参数重置等。

    与简单的 QGLWidget / PaintGL 场景相反,您可以一劳永逸地设置全局 OpenGL 状态并简单地在每帧调用渲染基元,您将不得不在调用后恢复几乎所有内容到beginNativePainting(链接/绑定您的着色器,设置全局参数,选择和启用各种缓冲区等)。

    这也意味着您应该谨慎使用原生绘画。让每个小部件都进行自定义绘制可能很快就会让您的渲染陷入困境。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-20
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多