【问题标题】:QGLWidget update(rect) always paints the entire rectQGLWidget update(rect) 总是绘制整个矩形
【发布时间】:2015-03-08 09:37:06
【问题描述】:

我有一个使用QGLWidget 的简单绘画应用程序,我将其称为update(rect),传入一个比QGLWidget 的矩形小得多的矩形。我使用QImage 进行绘制,然后在paintEvent 中,将其中的一部分绘制到QGLWidget。当我在paintEvent 方法上设置断点并调用event->rect()event->region().rects() 时,它会返回QGLWidget 的整个矩形。我本来希望它只返回传递给更新方法的矩形。

因此,在我的 iPhone 上绘图非常滞后。

这是我的代码:http://pastebin.com/beyyHCPw

如果您滚动到 pastebin 的底部,您将看到我的日志记录代码,我在其中记录了我绘制的矩形(绘制矩形),然后哪个矩形返回到绘制事件中(更新矩形)。

【问题讨论】:

  • 您检查过标准化矩形的坐标是否正确吗?
  • @MarcusMüller 是的,我在那里有一个 qDebug,正在查看我的矩形坐标,它们看起来很好。

标签: ios macos performance qt qt5


【解决方案1】:

我认为,如果 QGLWidget 使用双缓冲并且每次都要求您在不同的缓冲区中绘制,则这是意料之中的。

据我所知,脏矩形是一个通常不以这种方式用于 GL 的概念。

您的代码的性能问题也可能是您在主内存中更改后每次绘制 1024x1536 QImage 的内容时将其上传到图形内存。绘制到中间 Q(Open)GLFramebufferObject 可能是一种改进(尽管 iPhone 上可能不支持使用 GL_EXT_framebuffer_blit 进行快速位传输)。

【讨论】:

  • 谢谢,我会试试 QGLFramebuffer 对象。如何将帧缓冲区放入 QGLWidget?
  • 尽可能使用 QOpenGL* 类而不是 QGL*(在 5.4 中),后者已被弃用。如果 hasOpenGLFramebufferBlit 为真,则可以使用 QOpenGLFramebufferObject::​blitFramebuffer。否则它会变得更复杂,你必须从 QOpenGLFramebufferObject::texture 获取纹理 id,并使用 QOpenGLWidget 上的原始 GL 代码绘制它,包装在 QPainter::​beginNativePainting 中。它会很快变得混乱,因此请确保您首先尝试使用非 GL QWidget 或使用 QML Canvas 项目,它们应该在非极端情况下也能给您带来良好的性能。
  • 将 GOpenGLFramebufferObject 绘制到 QOpenGLWidget 的最简单方法是什么? QOpenGLWidget 没有 drawTexture 方法。
  • 澄清一点:QOpenGLFramebufferObject::​blitFramebuffer with target=0,但同样只有当 hasOpenGLFramebufferBlit 为 true 时(这意味着您的 GL 驱动程序支持 GL_EXT_framebuffer_blit)。
猜你喜欢
  • 2017-07-14
  • 1970-01-01
  • 2014-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多