减少绘制的 TChart 点数
Reduce the number of drawn TChart points
我的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.Minimum
和 chart.BottomAxis.Maximum
属性来移动视图框架。我会对 AVG 绘图感到满意,其中平均值的数量是图表上的水平像素数量。
我四舍五入 DateTime 值
axisTimestamp := Trunc(timestamp * 40000) / 40000;
然后使用此值设置图表点。
如果存在具有此类 XValue 的点,则我计算平均值:
if series.XValue[i] = axisTimestamp then
series.YValue[i] := (series.YValue[i] + newValue) / 2;
我的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.Minimum
和 chart.BottomAxis.Maximum
属性来移动视图框架。我会对 AVG 绘图感到满意,其中平均值的数量是图表上的水平像素数量。
我四舍五入 DateTime 值
axisTimestamp := Trunc(timestamp * 40000) / 40000;
然后使用此值设置图表点。
如果存在具有此类 XValue 的点,则我计算平均值:
if series.XValue[i] = axisTimestamp then
series.YValue[i] := (series.YValue[i] + newValue) / 2;