2009-07-15 75 views
3

我正在使用pygtk爲Maemo平臺編寫一個應用程序,並且樹視圖的渲染速度似乎是一個問題。由於應用程序是媒體控制器,因此我在UI中使用了過渡動畫。這些動畫在圍繞UI移動時將控件滑動到視圖中。樹控件的問題是速度慢。加速GTK樹視圖

只是在屏幕中間移動小部件並不是那麼慢,但如果細胞暴露,幀速率真的下降。是什麼讓這更令人討厭的是,如果唯一被曝光的領域是帶有行標籤的標題行,則幀率仍然在控制之下。

由此判斷,我懷疑GTK樹視圖是每次單行像素曝光時再次繪製完整單元格。有沒有辦法強制GTK將整個小部件繪製到某個緩衝區中,即使它的某些部分不在屏幕上,然後在動畫時使用緩衝區繪製小部件?

使用Viewport和滾動並使用佈局面板和向下移動小部件之間還有區別嗎?我曾想象過Viewport速度更快,但當我嘗試使用兩種版本時,我沒有看到真正的區別。

我知道這不一定是GTK創建的。我試過的其他選擇是pygame,但我更喜歡一些具有基於窗口小部件的事件處理內置的更高級別的實現。此外,pygtk具有在Windows和窗口中運行的好處,因此開發更容易。

回答

1

我從來沒有這樣做過,但你可以嘗試自己實現緩存。而不是使用預定義的單元格渲染器,實現您自己的單元格渲染器(可能作爲實際的單元渲染器的包裝器),但緩存pixmaps。

在PyGTK中,您可以使用gtk.GenericCellRenderer。在你的裝飾單元渲染器,請執行下列操作時,要求呈現:

  • 保持關閉屏幕像素圖的緩存(或更好的,只是一個大的一個)和大小的緩存
  • 如果要求預測大小或渲染,創建相關屬性的關鍵
  • 如果在緩存中存在的關鍵,使用緩存的像素圖,位塊傳輸上您將得到
  • 否則繪製緩存的像素圖,先有實際的單元格渲染器做工作然後複製它

最後一步還意味着緩存確實會在第一次渲染單元時產生開銷。通過使用緩存策略可以緩解這個問題。你可能想嘗試不同的東西,基於呈現值的分佈:

  • 如果所有細胞都是獨一無二的,並不比緩存都達到一定極限的事,或者一些MRU策略
  • 如果你有一些Zipf distribution,即一些細胞是非常普遍的,而其他細胞是非常罕見的,你應該只緩存高頻率的細胞,並擺脫稀有細胞值的緩存開銷。

這就是說,我不能說它是否會有所作爲。我從一個有點類似的問題中得到的經驗是,任何涉及文本的東西通常都很慢,以至於緩存纔有意義 - 對不起,我不能給出更簡單的建議。

在嘗試之前,您還可以簡單地編寫一個裝飾單元格渲染器,它只計算您的單元格實際渲染的頻率並獲取一些時間信息,以便您瞭解熱點的位置以及緩存值會有任何意義。