【问题标题】:QPainter performance high frame rateQPainter 性能高帧率
【发布时间】:2010-11-18 19:27:50
【问题描述】:

我正在尝试在 QPainter(在 OpenGL 小部件中)中以 60fps 的速度显示视频

我遇到了一个问题,有时绘制时间过长,并且在使用 QPainter 时会发生下一次重绘事件 - 这会生成警告和随机崩溃。

几个问题:
有没有一种“Qt 方式”来有效地联锁重绘调用,因为大概 QPainter 知道它正在被使用 - 还是我只是使用我的平台互斥体支持?

有没有比仅调用 repaint() 的计时器更好的方法来以高帧速率(当然也需要锁定到 VSync)进行绘制?

【问题讨论】:

  • 定时器触发时你调用的指令到底是什么?或者,如果你自己不调用任何东西,你如何强制执行 60fps?
  • repaint(),然后我重载 paintEvent() 来获取我的图像数据并将其填充到一个 QImage 中并进行渲染
  • 你可以在单独的线程中创建 QImages,这样绘画线程在每个paintEvent 上将需要更少的时间。
  • 我是否正确理解了这个序列?你想重绘一个 GL 小部件,所以你覆盖了绘制事件,绘制到一个图像,然后在 GL 小部件上渲染该图像?
  • @Caleb - 基本上是的。我需要以 60fps 的速度将 QImage 放到屏幕上。在过去,当你知道你的屏幕在哪里时,这一切都是那么简单!

标签: c++ multithreading qt video


【解决方案1】:

尝试使用update() 而不是repaint()

此功能不会导致 立即重绘;取而代之的是 安排一个绘制事件进行处理 当 Qt 返回主赛事时 环形。这允许 Qt 优化 比一个更快的速度和更少的闪烁 调用 repaint() 可以。

多次调用 update() 通常只产生一个 paintEvent() 调用。

【讨论】:

  • 我需要绘制事件尽快发生(理想情况下,我希望在下一个 VSync 上发生一个事件 - 那是在 Qt5 中) - 我需要每 1/60 秒绘制一帧。当你有很多小部件要重绘时,Update() 更合适
  • 更新并不慢,它只是缓冲重绘调用以避免闪烁和不必要的调用。尝试一下。但是如果它真的太慢,也许使用 QtOpenGl 而不是 QPainter 会更好?或者也许是声子?顺便说一句,视频的来源是什么?
  • 我正在使用 QGLWidget 进行渲染,只需调用 QPainter::drawImage() - 据说这是使用 OGL2 进行的硬件加速。视频最终来自相机 - 但我必须对每个 QImage 进行一些处理。
猜你喜欢
  • 1970-01-01
  • 2012-07-02
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-19
  • 1970-01-01
相关资源
最近更新 更多