簡體   English   中英

如何使用硬件加速在 Qt 中繪畫?

[英]How to paint in Qt using hardware acceleration?

我需要在我的應用程序中進行一些非常密集的繪圖過程 - 我正在錄制相機和桌面。 我正在使用ffmpeg來捕獲和編碼/解碼我的視頻。 這些過程非常快,並且它們在單獨的線程中工作,但是在渲染方面 - 性能急劇下降。 我正在使用QLabel通過setPixmap()方法顯示捕獲的幀,並且我看到 Qt 沒有使用任何 GPU 功率,即使矩陣操作(例如縮放圖像以適合窗口)是明確暗示的。 有沒有辦法使用硬件加速在 Qt 中繪制圖像? 或者還有其他方法可以加快繪畫過程嗎?

軟件渲染並不是唯一可能的性能殺手。

我也曾經將 QWidget 用於類似類型的工作,似乎還可以。

我假設 FFmpeg 處理的結果是一個帶有 YUV 或 RGB 配色方案的未壓縮字節數組。

  1. 您已經為 FFmpeg 圖像幀分配了一些內存。
  2. 我相信您正在使用QPixmap::fromImage(...)創建像素圖,這意味着復制。
  3. 但首先,您需要構造 QImage,這可能意味着復制。

所以我們每一幀都有一兩個完整的副本。

嘗試使用現有內存緩沖區的 QImage 構造函數之一(請參閱Qt 文檔)。 或者,理想情況下,您應該有一次分配的 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 端需要一些周期。 不過,轉換操作會變得更快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM