2009-07-15 34 views
3

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

只是在屏幕中间移动小部件并不是那么慢,但如果细胞暴露,帧速率真的下降。是什么让这更令人讨厌的是,如果唯一被曝光的领域是带有行标签的标题行,则帧率仍然在控制之下。

由此判断,我怀疑GTK树视图是每次单行像素曝光时再次绘制完整单元格。有没有办法强制GTK将整个小部件绘制到某个缓冲区中,即使它的某些部分不在屏幕上,然后在动画时使用缓冲区绘制小部件?

使用Viewport和滚动并使用布局面板和向下移动小部件之间还有区别吗?我曾想象过Viewport速度更快,但当我尝试使用两种版本时,我没有看到真正的区别。

我知道这不一定是GTK创建的。我试过的其他选择是pygame,但我更喜欢一些具有基于窗口小部件的事件处理内置的更高级别的实现。此外,pygtk具有在Windows和窗口中运行的好处,因此开发更容易。

回答

1

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

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

  • 保持关闭屏幕像素图的缓存(或更好的,只是一个大的一个)和大小的缓存
  • 如果要求预测大小或渲染,创建相关属性的关键
  • 如果在缓存中存在的关键,使用缓存的像素图,位块传输上您将得到
  • 否则绘制缓存的像素图,先有实际的单元格渲染器做工作然后复制它

最后一步还意味着缓存确实会在第一次渲染单元时产生开销。通过使用缓存策略可以缓解这个问题。你可能想尝试不同的东西,基于呈现值的分布:

  • 如果所有细胞都是独一无二的,并不比缓存都达到一定极限的事,或者一些MRU策略
  • 如果你有一些Zipf distribution,即一些细胞是非常普遍的,而其他细胞是非常罕见的,你应该只缓存高频率的细胞,并摆脱稀有细胞值的缓存开销。

这就是说,我不能说它是否会有所作为。我从一个有点类似的问题中得到的经验是,任何涉及文本的东西通常都很慢,以至于缓存才有意义 - 对不起,我不能给出更简单的建议。

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