2013-08-04 57 views
4

我們正在嘗試爲我們公司的一些基於Linux的嵌入式設備使用Qt 4.8.5。我使用沒有X服務器的Qt嵌入。我需要繪製測量數據並經常更新它們(20-30fps,但只是小部件的一小部分)。該系統是基於ARM的,400Mhz,沒有GPU和沒有FPU。我分類了QWidget並重寫了paintEvent()。我設置了WA_OpaquePaintEvent和WA_StaticContents。爲了測試,我的繪畫事件是空的,我調用窗口小部件的update()函數將計時器設置爲50ms。我的問題是空的更新佔用CPU的30%。數量因更新區域而異,所以我認爲QT可能會在後臺重新繪製一些東西。我已閱讀了很多帖子,但找不到解決方案。如果我註釋掉更新調用,CPU使用率下降到〜1%(即使我在用於測試小部件的計時器中生成正弦,這應該比空函數調用複雜得多)。我的部件是矩形的,不透明,我想處理繪畫事件中的完整繪圖程序。Qt自定義小部件更新大開銷

是否有可能減少這種開銷,並處理我自己的整個繪畫過程?

+0

如果你只想更新一小部分,你嘗試通過更新(QRect)或更新(QRegion)來限制更新區域嗎? –

+0

是的,我試過了。如果我這樣做,CPU使用率會因區域大小而下降。但是,例如,更新25個像素寬的區域比兩個5個像素區域分開15個未更改的像素更便宜,所述像素未更新。對於調試,我已經禁用了我的畫家,而paintEvent只是一個空的函數。我的問題是,如果我在paintEvent函數中沒有做任何事情,爲什麼它使用CPU呢? (我知道它必須被調度和調用,但它應該是一個最小的開銷,並且不應該與更新區域成比例)。 – xdever

+0

那麼,如果你沒有明確地繪製任何東西,那麼小部件也將被更新,因爲之前的任何內容都將被清除。 –

回答

1

「空更新」不爲空 - 它重畫整個窗口:)

你看了下面的?

要快速更新簡單背景顏色的自定義小部件(如實時繪圖或繪圖小部件),最好定義合適的背景顏色(使用帶QPalette :: Window角色的setBackgroundRole()),設置autoFillBackground屬性,並且只在widget的paintEvent()中實現必要的繪圖功能。

你也應該使用QWidget::scroll(),因爲在內部它滾動窗口的後備存儲,這是比如果只有一小片被添加到它重新繪製整個事情更加有效。