如何使用硬件加速在Qt中绘画?

问题描述

我需要在应用程序中进行一些非常密集的绘制过程-我正在记录相机和台式机。我正在使用ffmpeg来捕获和编码/解码我的视频。这些过程非常快,并且它们在单独的线程中工作,但是当涉及到渲染时,性能会急剧下降。我正在使用QLabel通过setpixmap()方法显示捕获的帧,并且我发现Qt不使用任何GPU功能,即使明确暗示了矩阵操作(例如缩放图像以适合窗口)。有什么办法可以使用硬件加速在Qt中绘制图像吗?还是有其他方法可以加快绘画过程?

解决方法

软件渲染不是唯一可能的性能杀手。

我以前也使用QWidget完成类似的工作,这似乎还可以。

我假设FFmpeg处理的结果是具有YUV或RGB颜色方案的未压缩字节数组。

  1. 您已经为FFmpeg图像帧分配了一些内存。
  2. 我相信您正在使用QPixmap::fromImage(...)创建像素图,这意味着要进行复制。
  3. 但是首先,您需要构造QImage,这可能意味着要复制。

所以我们每帧有一两个完整副本。

尝试使用现有内存缓冲区的QImage构造函数之一(请参见Qt docs)。 或者,理想情况下,您应该分配一次QImage并将其内存缓冲区与FFmpeg一起使用(FFmpeg直接写入QImage)

将QWidget细分,重新实现paintEvent()并在此处绘制您的QImage(不是QPixmap)。 理想情况下,它应该是与上一步相同的QImage。

ffmpeg 
{
    mutex.lock();
    write(image);
    mutex.unlock();
}

QWidet::paintEvent
{
    mutex.lock();
    paint(image);
    mutex.unlock();
}

您绝对可以使用QOpenGLWidget进行GPU绘图,我认为这对您没有太大帮助。

QOpenGLWidget使用缓冲渲染(即复制),将图像从CPU端上传到GPU端需要一些周期。 不过,转换操作将变得更快。