【问题标题】:Reduce the number of drawn TChart points减少绘制的TChart点数
【发布时间】:2018-12-03 20:00:44
【问题描述】:

我的TChart有很多通过series.AddXY方法加分。每秒添加一个点(但也可能有很长一段时间没有数据)。更改图表(添加点)后,当我转到带有图表的选项卡时,大约需要 5 秒才能重新绘制。

我认为使用聚合函数有助于更快地绘制图表:

ser1: TFastLineSeries;
ser2: TPointSeries;
ser3: TFastLineSeries;
utc: TDateTime;

ser1.SetFunction(TAverageTeeFunction.Create(Self));
ser1.FunctionType.Period := 100;
ser1.FunctionType.PeriodStyle := psRange;

ser2.SetFunction(TAverageTeeFunction.Create(Self));
ser2.FunctionType.Period := 100;
ser2.FunctionType.PeriodStyle := psRange;

ser3.SetFunction(TAverageTeeFunction.Create(Self));
ser3.FunctionType.Period := 100;
ser3.FunctionType.PeriodStyle := psRange;

for i := 0 to 30000 do begin
   .....
   ser1.AddXY(utc, 0, utcStr);
   ser2.AddXY(utc, deviation, utcStr);
   ser3.AddXY(utc, trend, utcStr);
   .....
end;

但它和以前一样慢。

如何更快地绘制图表?

更新

这是 3 小时数据的不可缩放图表。 “Now”在右边,“-3h”在左边。点不断到达右侧并从左侧删除。通过设置chart.BottomAxis.Minimumchart.BottomAxis.Maximum 属性来移动视图框架。我会对 AVG 绘图感到满意,其中平均值的数量是图表上的水平像素数量。

【问题讨论】:

  • stackoverflow.com/questions/4767684/… 如果可能,还要考虑某种抽取
  • 它可以用于 TFastLineSeries - DrawAllPoints
  • 是的,这是真的。是否需要显示所有数据范围(按 X)?
  • 对于类似示波器的图表,我准备了数据数组(最多 1024 个点)并用过滤后的数据填充它们,然后在每一步更新最后一个值并重新填充系列数据
  • 你还需要chart.BottomAxis.Minimum左边的数据吗?如果没有,您可能需要不时删除这些点,这样可以释放内存并且还可以稍微提高绘图性能。

标签: delphi teechart


【解决方案1】:

我对 DateTime 值进行了四舍五入

axisTimestamp := Trunc(timestamp * 40000) / 40000;

然后用这个值来设置图表点。

如果存在具有此类 XValue 的点,则我计算平均值:

if series.XValue[i] = axisTimestamp then
    series.YValue[i] := (series.YValue[i] + newValue) / 2;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多