QPainter性能高的帧率

6

我正在尝试在QPainter(在OpenGLwidget中)以60fps显示视频。

我遇到了一个问题,有时候绘制需要的时间太长,下一个重绘事件会在QPainter正在使用时发生 - 这会生成警告和随机崩溃。

几个问题:
是否有一种“Qt方式”有效地交错对重绘的调用,因为QPainter知道自己正在使用 - 还是我只是使用平台的互斥支持?

除了使用定时器调用repaint()之外,有没有更好的方法以高帧率绘制(当然还需要锁定VSync)?


当计时器触发时,您调用的指令是什么?或者,如果您没有自己调用任何内容,那么如何强制执行60fps? - Sebastian Negraszus
你可以在一个单独的线程中创建QImages,这样绘画线程在每个paintEvent上需要的时间就会更少。 - smerlin
我是否正确理解这个序列?您想重新绘制一个GL小部件,因此您覆盖了paint事件,将其绘制到图像上,然后在GL小部件上呈现该图像? - Caleb Huitt - cjhuitt
@Caleb - 基本上是的。我需要以60fps的速度将QImage放到屏幕上。在旧时代,当你知道你的屏幕在哪里时,这一切都是如此简单! - Martin Beckett
@Martin Beckett:如果你只是将图像贴到GL小部件上,我仍然质疑GL小部件的实用性。如果你有后端驱动程序,即使你只使用QWidget,Qt也应该使用硬件加速来贴图像。 - Caleb Huitt - cjhuitt
显示剩余8条评论
1个回答

2

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

这个函数不会立即重绘;相反,它会在Qt返回主事件循环时安排一个绘制事件进行处理。这使得Qt可以优化更快的速度和更少的闪烁,比调用repaint()更好。

多次调用update()通常只会导致一次paintEvent()调用。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接