[英]How to paint in Qt using hardware acceleration?
我需要在我的應用程序中進行一些非常密集的繪圖過程 - 我正在錄制相機和桌面。 我正在使用ffmpeg
來捕獲和編碼/解碼我的視頻。 這些過程非常快,並且它們在單獨的線程中工作,但是在渲染方面 - 性能急劇下降。 我正在使用QLabel
通過setPixmap()
方法顯示捕獲的幀,並且我看到 Qt 沒有使用任何 GPU 功率,即使矩陣操作(例如縮放圖像以適合窗口)是明確暗示的。 有沒有辦法使用硬件加速在 Qt 中繪制圖像? 或者還有其他方法可以加快繪畫過程嗎?
軟件渲染並不是唯一可能的性能殺手。
我也曾經將 QWidget 用於類似類型的工作,似乎還可以。
我假設 FFmpeg 處理的結果是一個帶有 YUV 或 RGB 配色方案的未壓縮字節數組。
QPixmap::fromImage(...)
創建像素圖,這意味着復制。所以我們每一幀都有一兩個完整的副本。
嘗試使用現有內存緩沖區的 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.