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

How to paint in Qt using hardware acceleration?

我需要在我的应用程序中执行一些非常密集的绘图过程 - 我正在录制相机和桌面。我正在使用 ffmpeg 来捕捉和 encode/decode 我的视频。这些进程非常快,并且它们在单独的线程中工作,但在渲染时 - 性能会急剧下降。我正在使用 QLabel 通过 setPixmap() 方法显示捕获的帧,我发现 Qt 没有使用任何 GPU 功率,即使矩阵运算,例如缩放图像以适应 window 是明确暗示。有什么方法可以使用硬件加速在 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 端需要一些周期。 不过,转换操作会变得更快。