问题描述
我需要在应用程序中进行一些非常密集的绘制过程-我正在记录相机和台式机。我正在使用ffmpeg
来捕获和编码/解码我的视频。这些过程非常快,并且它们在单独的线程中工作,但是当涉及到渲染时,性能会急剧下降。我正在使用QLabel
通过setpixmap()
方法显示捕获的帧,并且我发现Qt不使用任何GPU功能,即使明确暗示了矩阵操作(例如缩放图像以适合窗口)。有什么办法可以使用硬件加速在Qt中绘制图像吗?还是有其他方法可以加快绘画过程?
解决方法
软件渲染不是唯一可能的性能杀手。
我以前也使用QWidget完成类似的工作,这似乎还可以。
我假设FFmpeg处理的结果是具有YUV或RGB颜色方案的未压缩字节数组。
- 您已经为FFmpeg图像帧分配了一些内存。
- 我相信您正在使用
QPixmap::fromImage(...)
创建像素图,这意味着要进行复制。 - 但是首先,您需要构造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端需要一些周期。 不过,转换操作将变得更快。