我正在使用pygtk编写Maemo平台的应用程序,树视图的渲染速度似乎是一个问题。由于应用程序是媒体控制器,我在UI中使用过渡动画。这些动画在围绕UI移动时将控件滑动到视图中。树控件的问题是它很慢。
只是在屏幕中间移动小部件并不是那么慢但是如果正在暴露单元格,帧速率确实会下降。更令人讨厌的是,如果唯一暴露的区域是带有行标签的标题行,则帧速率仍然受到控制。
据此判断,我怀疑每次暴露单行像素时GTK树视图再次绘制完整的单元格。有没有办法以某种方式强制GTK将整个小部件绘制到某个缓冲区中,即使它的一部分在屏幕外,然后在动画时使用缓冲区绘制小部件?
使用Viewport并向上滚动并使用“布局”面板并向下移动小部件也有区别吗?我想象Viewport更快,但是当我尝试两个版本时,我看到没有真正的区别。
我知道这不一定是为GTK创建的。我尝试过的其他替代方法是pygame,但我更喜欢内置基于小部件的事件处理的更高级别的实现。此外,pygtk还可以在Windows和窗口中运行,因此开发更容易。
答案 0 :(得分:1)
我自己从未这样做,但你可以尝试自己实现缓存。不使用预定义的单元格渲染器,而是实现自己的单元格渲染器(可能作为实际渲染器的包装器),但缓存像素图。
在PyGTK中,您可以使用gtk.GenericCellRenderer
。在装饰器单元格渲染器中,请求渲染时执行以下操作:
最后一步还意味着在第一次呈现单元格时,缓存确实会产生开销。通过使用缓存策略可以稍微减轻此问题。您可能希望根据渲染值的分布尝试不同的东西:
话虽如此,我不能说它是否会有所作为。我从一个有点类似问题的经验是,任何涉及文本的东西通常都很慢,以至于缓存是有道理的 - 抱歉我不能给出更简单的建议。
在您尝试之前,您还可以简单地编写一个装饰单元格渲染器,它只计算您的单元格实际渲染的频率并获取一些计时信息,以便您了解热点的位置以及是否缓存值没有任何意义。