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

Fen*_*Fix 3 c++ qt ffmpeg libav

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

Sam*_*dov 5

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

我也曾经使用 QWidget 来完成类似的工作,看起来还不错。

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

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

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

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

子类 QWidget,paintEvent()在那里重新实现并绘制您的 QImage(不是 QPixmap)。理想情况下,它应该与上一步中的 QImage 相同。

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

QWidet::paintEvent
{
    mutex.lock();
    paint(image);
    mutex.unlock();
}
Run Code Online (Sandbox Code Playgroud)

您绝对可以使用 QOpenGLWidget 进行 GPU 绘图,但在我看来,这对您没有多大帮助。

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