Уменьшите количество нарисованных очков TChart - PullRequest
0 голосов
/ 25 июня 2018

My 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 часа данных.«Сейчас» находится на правом краю, «-3ч» слева.Очки постоянно поступают справа и удаляются слева.Рамка обзора смещается путем установки свойств chart.BottomAxis.Minimum и chart.BottomAxis.Maximum.Я был бы удовлетворен рисованием AVG, где количество средних значений - это горизонтальное количество пикселей на графике.

1 Ответ

0 голосов
/ 25 июня 2018

Я округлил значение DateTime

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

, а затем использовал это значение для установки точки графика.

Если точка с таким значением XValue существует, тогда я вычисляю среднее значение:

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