2011-05-22 115 views
7

我有一個類,它顯示了QWidget中的audiofiles的波形數據(請參閱下面的小部件的屏幕截圖,那時我仍然使用漸變,這導致了糟糕的性能)。qpainter繪畫替代品(在Mac上表現糟糕)

的音頻數據在的paintEvent繪直接使用多次調用QPainter::drawLine微件(呼叫的最小量QWidget::drawLine相當於插件=>至少一條線的寬度對於每個x座標)。 雖然這種方法在Windows上運行得非常好(全屏幕中的paintEvent大約需要4ms),但是當程序在MacOS下運行時,性能會降低4-5倍。

繪畫的性能對於顯示數據的流體滾動很重要。

所以我的問題是,有沒有人知道一個更快的替代QPainter.drawLine繪製線(平臺相關的解決方案可能是好的,只要他們可以在paintEvent中使用),或有一種方法來加速滾動,某種緩衝等?

old screenshot of the widget (still used gradients, which caused poor performance)

回答

4

的Qt的最新版本(4.7.x)使用​​核芯顯卡後端繪畫。有時你發現它會變慢。在Windows上,它使用了一個性能非常好的軟件渲染器。

我的建議是不要在繪畫事件中直接繪製傳遞的畫家。相反,創建一個與您的Widget繪圖區域大小相同的QImage並在其上繪製。這將使用更快的軟件渲染器。然後在需要時將QImage繪製到畫家身上。

+0

我們正在使用qt 4.4,我已經嘗試先在QPixmap上繪製數據,然後將小部件繪製到小部件上,但加速效果並不理想(QPainter :: drawLine在繪製像素圖時並不明顯) – smerlin 2011-05-22 18:06:28

+1

我記得QPixmap與QImage的不同之處在於QPixmap使用平臺「加速」後端。在OS X中,這意味着它仍然是Core Graphics。使用QImage將確保您使用的是軟件渲染器。 – 2011-05-22 20:40:49

+0

@smerlin QPixmap針對在屏幕上顯示圖像進行了優化,而QImage針對I/O進行了優化。如果你使用QPixmap繪製線條,那麼它會變慢。 – Arlen 2011-05-24 04:53:03

0

您可以構建一個QPainterPath並繪製該對象,而不是重複調用drawLine函數。而且,您可以緩存路徑,所以在第一次繪製後會更快。

+0

使用QPainterPath的性能差10倍:/ – smerlin 2011-05-23 12:07:04

4

如果你想繪製真的很快,使用OpenGL和QGLWidget

+0

只是從'QGLWidget'而不是'QWidget'派生出來的,因爲很多繪畫事件都是簡單的沒有路由到窗口小部件,另外應用程序只是在MacOS上崩潰,並顯示錯誤消息:「必須在QPaintDevice之前構造一個QApplication」,而我顯然已經有了一個QApplication實例。 – smerlin 2011-05-23 12:10:39

+0

此外,我懷疑只是切換到OpenGL不會加速任何事情,因爲我繪製的數據會改變每一幀,並且這些數據仍然必須上傳到顯卡幾乎每一幀?! – smerlin 2011-05-23 12:18:31

+0

如果您使用QGLWidget,則需要使用OpenGL API繪製圖像。在你的照片中繪製簡單的折線很容易。是的,當數據每幀改變一次時,數據會被移動到顯卡的內存中,但數據量應該非常小,以至於不會成爲問題。而實際的繪圖將會非常快。 – 2011-05-23 15:55:40