2011-06-28 275 views
1

我有一個大的顯示屏(約1000x2000像素)和我做下面的繪製圖片到屏幕上:QPainter性能如何提高?

QImage *pImage = GetImage(); // from wherever 
QPainter painter(this); 
painter.drawImage((0,0), *pImage); // this line takes over 100ms to complete. 

屏幕越大的是,我畫到,時間越長這種塗料需要。我想pImage是memcpy'd,這是不同的。我怎樣才能減少這種開銷?我並沒有試圖在這裏擴展或任何東西。

謝謝。

+0

如下所示:\t 我也應該注意到,我使用的是一個QImage,因爲我操縱QIMAGE :: RGB16格式的原始圖像緩衝區。基於此,我不知道我可以使用QPixmap來代替。你知道一種將QPixmap設置爲該格式的原始圖像緩衝區的方法嗎? – glutz

+0

您不能將原始像素「填充」到QPixmap中。 QImage是正確的選擇。如果相同的圖像不會被多次繪製,無論如何都無法將其轉換爲QPixmap。這是什麼平臺?我知道Mac上的「加速」默認畫家後端真的很慢。嘗試從QImage創建一個畫家,並看到相同的操作是更快。 –

+0

@Stephen Chu。我正在創建一個來自QImage的畫家。或者你的意思是別的嗎?我在Ubuntu 10.10上。 – glutz

回答

2

您正在繪製一個QImage。不要這樣做,請嘗試使用QPixmap。

QImage documentation

QImage的被設計和優化用於I/O,以及用於直接像素訪問和操作,而的QPixmap被設計和用於在屏幕上顯示的圖像優化的「

取決於平臺,將QImage數據轉換爲繪製所需的格式和位置可能非常昂貴。

PS:沒有必要在堆上創建QImages,因爲

由於QImage類使用隱式數據共享,QImage對象可以按值傳遞。

+0

我也應該注意到我使用的是一個QImage,因爲我操作的是QIMAGE :: RGB16格式的原始圖像緩衝區。基於此,我不知道我可以使用QPixmap來代替。你知道一種將QPixmap設置爲該格式的原始圖像緩衝區的方法嗎? – glutz

+0

@glutz:您可以從原始數據創建QPixmaps,但之後無法更改數據並自動更改QPixmap。在X11上,像素圖存儲在服務器地址空間中,因此從客戶端獲取它是很昂貴的。也許嘗試不重新生成每個油漆上的圖像,但只有當實際發生變化時。 –

0

你可以做的一個簡單的改進是隻繪製需要更新的區域(如果可以的話)。 QPaintEvent包含已更改區域的矩形,並且QPainter::drawImage有重載,可以對要繪製的部分採取反向。

您也可以查看ImageConversionFlags選項以獲得更快的選項。