gpt4 book ai didi

python - 加速 GTK TreeView

转载 作者:行者123 更新时间:2023-11-28 18:55:58 25 4
gpt4 key购买 nike

我正在使用 pygtk 为 Maemo 平台编写应用程序, TreeView 的渲染速度似乎是个问题。由于该应用程序是一个媒体 Controller ,因此我在 UI 中使用了过渡动画。在 UI 中移动时,这些动画会将控件滑入 View 。树控件的问题是它很慢。

只是在屏幕中间四处移动小部件并没有那么慢,但是如果单元格被暴露,帧率确实会下降。更烦人的是,如果唯一暴露的区域是带有行标签的标题行,则帧速率仍处于控制之下。

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

此外,使用视口(viewport)并将其向上滚动与使用布局面板并将小部件向下移动之间是否存在差异?我原以为 Viewport 会更快,但当我尝试这两个版本时,我没有发现真正的区别。

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

最佳答案

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

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

  • 保留屏幕外像素图的缓存(或者更好,只是一个大的)和大小的缓存
  • 如果要求预测大小或渲染,则根据相关属性创建一个键
  • 如果缓存中存在键,则使用缓存的像素图,将缓存的像素图位 block 传输到给定的可绘制对象上
  • 否则,首先让实际的单元格渲染器完成工作,然后复制它

最后一步还意味着缓存确实会在第一次渲染单元格时产生开销。使用缓存策略可以稍微缓解这个问题。您可能想根据渲染值的分布尝试不同的东西:

  • 如果所有单元格都是唯一的,那么除了将所有内容缓存到某个限制或一些 MRU 策略之外没什么可做的
  • 如果你有某种 Zipf distribution ,即一些单元格非常常见,而另一些单元格非常罕见,您应该只缓存高频单元格,并消除罕见单元格值的缓存开销。

话虽这么说,但我不能说它是否会产生任何影响。我从一个有点类似的问题中得到的经验是,任何涉及文本的东西通常都足够慢,以至于缓存是有意义的——抱歉,我不能给出更简单的建议。

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

关于python - 加速 GTK TreeView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1132512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com