QPainter 性能高帧率

Posted

技术标签:

【中文标题】QPainter 性能高帧率【英文标题】:QPainter performance high frame rate 【发布时间】: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 放到屏幕上。在过去,当你知道你的屏幕在哪里时,这一切都是那么简单! 【参考方案1】:

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

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

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

【讨论】:

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

以上是关于QPainter 性能高帧率的主要内容,如果未能解决你的问题,请参考以下文章

使用 python 实现高帧率、低延时、支持多个 iOS 设备同时屏幕共享的工具

使用 QPainter 绘图

获取 QPainter 的可见区域

设置 QPainter 背景

9.3.1 QPainter相关函数介绍

OpenGL:纹理基元 + 高帧率