gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 22:52:51 30 4
gpt4 key购买 nike

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

最佳答案

软件渲染并不是唯一可能的性能杀手。
我也曾经将 QWidget 用于类似的工作,而且似乎还可以。
我假设 FFmpeg 处理的结果是带有 YUV 或 RGB 颜色方案的未压缩字节数组。

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

  • 所以我们每帧都有一两个完整的拷贝。
    尝试使用现有内存缓冲区的 QImage 构造函数之一(参见 Qt docs )。
    或者,理想情况下,您应该有一个分配一次的 QImage 并将其内存缓冲区与 FFmpeg 一起使用(FFmpeg 直接写入 QImage)
    Sublass 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 端需要一些周期。
    不过,转换操作将变得更快。

    关于c++ - 如何使用硬件加速在 Qt 中绘画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64427215/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com