【问题标题】:TVirtualStringTree - variable row height optimizationTVirtualStringTree - 可变行高优化
【发布时间】:2015-05-13 13:42:49
【问题描述】:

在我们的应用程序中,我正在从 TStringGrid 移动到 TVirtualStringTree 组件。正在显示大量数据(最多 50000 行和 5 列)。一列包含一行或多行文本。我设法在 stringgrid 中使用'DrawCell'以最佳性能实现多行功能:即时重绘所有行(调整大小时)和无阻碍地滚动(我在内存中有一个行高列表,将在需要重绘时更新) .

将此多行功能转移到 VirtualStringTree 的性能不如 stringgrid 替代方案。我尝试了许多实现,但还没有成功。这在VirtualStringTree安装包的Demo应用中很容易复现:

  1. 在“MultilineDemo”表单中,将 VirtualStringTree 的“rootNodeCount”设置为 10.000。
  2. 运行演示时,选择“根据节点文本自动调整节点高度”。

初始重绘/重绘会占用大量 CPU 时间。每次调整大小时,跳到顶部/底部会导致相同的现象,甚至导致“堆栈溢出”异常(但这是另一个问题......)。 'OnMeasureItem' 方法被调用的太多了,就像我看到的那样(即使是在 'MouseMove' 事件中)。

有没有人遇到过这个问题并设法找到解决方案?

【问题讨论】:

  • 我还没有检查过该演示是如何实现的(还),但如果它使用测量事件,那么您可以尝试不同的方式。您说您准备了一组行高,因此您可以尝试在填充树时使用NodeHeight 属性静态设置节点高度。但是,我预计不会有显着差异(假设他们在该演示中没有做任何昂贵的事情)。
  • 感谢您的建议@TLama。我已经尝试过使用我自己的高度集合,但还没有完全成功地制作出一个完整的工作版本。节点的重绘时间与 stringgrid 有点不同。

标签: delphi optimization virtualtreeview tvirtualstringtree


【解决方案1】:

这很容易在 Demo 应用程序中重现 VirtualStringTree 安装包

通过将ReinitNode() 的调用封装在BeginUpdate()EndUpdate() 中,至少可以轻松解决这个性能问题:

 MLTree.BeginUpdate();
  try
    MLTree.ReinitNode(nil, True);
  finally
    MLTree.EndUpdate();
  end;

我今天稍微修改了示例项目和虚拟树视图,示例项目现在运行起来更加顺畅。试试latest source code from GitHub

【讨论】:

    猜你喜欢
    • 2014-11-01
    • 1970-01-01
    • 2015-07-08
    • 2017-02-20
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多