Большой TChart занимает много времени для рисования - PullRequest
3 голосов
/ 22 января 2011

Главное сообщение: я принял ответ, но он не работает для меня. Я опубликую новый вопрос , подчеркивая Delphi 7. Спасибо всем, кто дал хороший вклад


Я провел измерения с интервалом в одну секунду в течение часа.

У меня был предыдущий вопрос, где требовалось 45 секунд, чтобы обновить TStringGrid, и мне удалось довести его до «быстрее, чем видит глаз». Частично путем перемещения некоторых функций цикла, связанных с вычислениями и базами данных, но - что удивительно для меня - изменение, которое действительно имело значение, заключалось в том, чтобы установить rowCount strindgrid равным 3600 перед циклом, а не увеличивать его внутри цикла.

Теперь у меня похожая проблема с TChart. Может быть, если я попытаюсь предварительно выделить диаграмму? Итак, я мог бы Chart1.Series[0].Count := 3600, но я не могу использовать AddXy() или Add(), так как я могу явно установить значения в серии?

У меня есть очень простая диаграмма, с плавающей точкой по оси Y и часами: секундами по оси X

Может кто-нибудь помочь или предложить другой способ ускорить рисование диаграммы?


Обновление: некоторые предложили использовать TFastLineSeries, но я не понимаю, как.

Ага - дважды щелкните на диаграмме, чтобы показать все серии, выберите один и нажмите изменить

Ответы [ 3 ]

5 голосов
/ 22 января 2011

«Официальные» рекомендации по быстрому составлению графиков можно найти на сайте Steema

4 голосов
/ 22 января 2011

Мне удается нарисовать миллионы точек данных в мгновение ока. Вот как я это делаю: Что вы можете сделать, это создать два массива для значений X и Y, заполнить их своими значениями, а затем эти массивы для вашей диаграммы. Например:

var
  XValues, YValues: array of double; 
begin

  SetLength(XValues, numberofValues);
  SetLength(YValues, numberofValues);

  for ix := 0 to numberofValues - 1 do 
  begin
    XValues[ix] := ...your values
    YValues[ix] := ...your values
  end;

  Chart.Series[0].XValues.Value := TChartValues(XValues);
  Chart.Series[0].XValues.Count := high(XValues);
  Chart.Series[0].XValues.Modified := true;
  Chart.Series[0].YValues.Value := TChartValues(YValues);
  Chart.Series[0].YValues.Count := high(YValues);
  Chart.Series[0].YValues.Modified := True;

То, что также ускоряет рисование, это использование TFastLineSeries вместо обычного TLineSeries. При использовании FastlineSeries у вас также есть свойство DrawAllPoints. При значении false рисование выполняется еще быстрее. Затем TChart пропустит точки данных, которые разделяют ту же позицию X с другими точками данных на экране. Это только нарисует первый пункт из них.

Здесь вы найдете опцию DrawAllPoints: alt text

2 голосов
/ 15 июля 2011

Я просто хотел бы прокомментировать ответ Михаэля Шмука.Использование High (XValues) для установки значения Count для ряда приводит к тому, что последний элемент в массиве не отображается.Это связано с тем, что high (XValues) возвращает самый высокий индекс массива, а не размер массива.

Конечно, это замечено только тогда, когда происходит очень низкое количество элементовбыть добавленным.

Chart.Series[0].XValues.Count := high(XValues) + 1;
...