加速GTK树视图

时间:2009-07-15 16:34:10

标签: python optimization gtk drawing pygtk

我正在使用pygtk编写Maemo平台的应用程序,树视图的渲染速度似乎是一个问题。由于应用程序是媒体控制器,我在UI中使用过渡动画。这些动画在围绕UI移动时将控件滑动到视图中。树控件的问题是它很慢。

只是在屏幕中间移动小部件并不是那么慢但是如果正在暴露单元格,帧速率确实会下降。更令人讨厌的是,如果唯一暴露的区域是带有行标签的标题行,则帧速率仍然受到控制。

据此判断,我怀疑每次暴露单行像素时GTK树视图再次绘制完整的单元格。有没有办法以某种方式强制GTK将整个小部件绘制到某个缓冲区中,即使它的一部分在屏幕外,然后在动画时使用缓冲区绘制小部件?

使用Viewport并向上滚动并使用“布局”面板并向下移动小部件也有区别吗?我想象Viewport更快,但是当我尝试两个版本时,我看到没有真正的区别。

我知道这不一定是为GTK创建的。我尝试过的其他替代方法是pygame,但我更喜欢内置基于小部件的事件处理的更高级别的实现。此外,pygtk还可以在Windows和窗口中运行,因此开发更容易。

1 个答案:

答案 0 :(得分:1)

我自己从未这样做,但你可以尝试自己实现缓存。不使用预定义的单元格渲染器,而是实现自己的单元格渲染器(可能作为实际渲染器的包装器),但缓存像素图。

在PyGTK中,您可以使用gtk.GenericCellRenderer。在装饰器单元格渲染器中,请求渲染时执行以下操作:

  • 保留屏幕外像素图的缓存(或更好,只有一个大图)和大小缓存
  • 如果要求预测尺寸或渲染,请从相关属性创建密钥
  • 如果密钥存在于缓存中,请使用缓存的pixmap,在你给出的drawable上blit缓存的pixmap
  • 否则,首先让实际的单元格渲染器完成工作,然后复制它

最后一步还意味着在第一次呈现单元格时,缓存确实会产生开销。通过使用缓存策略可以稍微减轻此问题。您可能希望根据渲染值的分布尝试不同的东西:

  • 如果所有单元格都是唯一的,除了缓存一切限制或一些MRU策略之外没什么可做的
  • 如果您有某种Zipf distribution,即某些单元格非常常见,而其他单元非常罕见,则只应高速缓存单元格并消除稀有单元格值的缓存开销。 / LI>

话虽如此,我不能说它是否会有所作为。我从一个有点类似问题的经验是,任何涉及文本的东西通常都很慢,以至于缓存是有道理的 - 抱歉我不能给出更简单的建议。

在您尝试之前,您还可以简单地编写一个装饰单元格渲染器,它只计算您的单元格实际渲染的频率并获取一些计时信息,以便您了解热点的位置以及是否缓存值没有任何意义。