Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.10.2013, 23:40   #1
grebljmax
Пользователь
 
Регистрация: 21.11.2010
Сообщений: 20
Восклицание Увеличение скорости TChart

Доброго Всем времени суток.

Уважаемые форумчане, помогите в решении следующей задачи :

Имеется Tchart на котором (например) отображается график скорости объекта с частотой 100 Гц в течении 2-3 часов. В результате подробного анализа какого либо участка, возникает большая задержка по времени (TChart.OnZoom). Подскажите пожалуйста в каком направлении двигаться для достижения максимальной скорости обработки события OnZoom. FastSeries не помогает. Обработка в отдельном потоке тоже не помогает.

Имеются следующие размышления на этот счет

1) Выводить не все точки (например if i mod 10=0 then ...), а при увеличении OnZoom скрывать TChart1 и показывать TChart2 на котором отображены все точки

2) Тоже самое что и в п.1 только при увеличении добавлять в выделенную область дополнительные точки для уточнения () ChartN.Series[I].ADDXY на интервале Zoom []

Если у кого имеются размышления на этот счет, с удовольствием ознакомлюсь и попробую реализовать, потаму как 1,2 пункт мне не сильно помогли

С Уважением, Максим
grebljmax вне форума Ответить с цитированием
Старый 05.10.2013, 00:05   #2
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

А так ли уж обязательно анализировать сам TChart? Может лучше анализировать исходные данные?
northener вне форума Ответить с цитированием
Старый 05.10.2013, 00:13   #3
grebljmax
Пользователь
 
Регистрация: 21.11.2010
Сообщений: 20
По умолчанию

Я наверное не правильно выразился, Northener.

Дело в том, что исходные данные отображаются в виде графика в компоненте TChart. Например в компоненте TChart выводится по оси Х время, по оси Y скорость в М/с. В 1 секунду имеется 100 точек, продолжительность всего интервала от 2 до 3 часов следовательно на графике отображается от 720000 до 1080000 точек. При увеличении какой либо области возникает пауза, вопрос в том, как минимизировать эту паузу
grebljmax вне форума Ответить с цитированием
Старый 05.10.2013, 00:25   #4
cotseec
Пользователь
 
Регистрация: 02.05.2012
Сообщений: 45
По умолчанию

много точек, варианты
1 проводить аппроксимацию при выводе всего графика (копить в буфер, а выводить прореживая, при увеличении куска графика увеличивать количество используемых точек из буфера, расположенных в увеличиваемом куске)
2 воспользоваться другими компонентами, например, Mitov PlotLab тут
Skype: cotseec
ICQ: 330-171-495

Последний раз редактировалось cotseec; 05.10.2013 в 00:33.
cotseec вне форума Ответить с цитированием
Старый 05.10.2013, 00:37   #5
grebljmax
Пользователь
 
Регистрация: 21.11.2010
Сообщений: 20
По умолчанию

Очень интересные решения, cotseec

1) Первый вариант я использовал, в принципе работает, но при увеличении все равно возникают задержки, а особенно при движении графика (зажимаешь правую кнопку и двигаешь в нужную сторону - возникает задержка для прорисовки).

2) Я обязательно попробую PlotLab, надеюсь поможет.

Огромное Вам спасибо за предложенные варианты)
grebljmax вне форума Ответить с цитированием
Старый 05.10.2013, 01:13   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

grebljmax, Задержка связана с количеством данным и скоростью прорисовки 100500 объектов. Попробуйте использовать интервалы времени.

т.е. график не будет отображать все 100500 точек сразу, а только точки с какой-то частотой. Допустим: каждый час. Все точки в периоде между 1-59 мин - игнорируются и не показываются на графике. С интервалом в 5 минут, показываются точки, идущие каждые пять минут, иные игнорируются. И так далее.

Это даст вам некоторые плюсы:
1. Вы сможете детально отобразить график с любым интервалом точек во времени, без увеличения.
2. Скорость прорисовки и реакции графика будет фантастической =)
Человек_Борща вне форума Ответить с цитированием
Старый 05.10.2013, 09:51   #7
grebljmax
Пользователь
 
Регистрация: 21.11.2010
Сообщений: 20
По умолчанию

Огромное спасибо за варианты, "Человек_Борща"

Это вариант был бы просто супер, но к сожалению я не нашел как реализовать эту идею. Какого нибудь ChartN.SeriesList[i].Points в delphi нету, возможно нужно смотреть в сторону отрисовки серий и там настраивать видимость.. (GetASeries), но я так и не смог найти где и как. Если есть какие то идеи, предложите, я буду Вам при много благодарен

С Уважением, Максим
grebljmax вне форума Ответить с цитированием
Старый 05.10.2013, 11:30   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Создайте список, где будете невидимо хранить данные.
В нем же настройте выдачу выборки точек, идущих определенным интервалом.

По этому списку, динамически, постройте серию в чарте.
Человек_Борща вне форума Ответить с цитированием
Старый 05.10.2013, 12:53   #9
grebljmax
Пользователь
 
Регистрация: 21.11.2010
Сообщений: 20
По умолчанию

Насколько я понял, Вы имеете ввиду нужно создать класс в котором будут храниться данные и который будет выдавать заполненную серию с заданным шагом.

Тогда при увеличении Tchart будут стираться точки с большим шагом дискретизации,а записываться будут точки с более мелким шагом.

Но процесс добавления и удаления точек тоже занимает очень много времени. Хотелось бы уйти от удаления и добавления, а решить проблему через видимость точек. Возможно есть идеи в этом направлении...

Цитата:
Type

ArrSeries = {packed} class(TObject) // Класс работы с серией TChart
private

public
DataX : Array of double; // Массив точек X
DataY : Array of double; // Массив точек Y
Count : Integer; // Количество точек в массиве
Function AddPointSeries (Incr : integer) : TLineSeries; Возвращает Series с шагом вывода incr

end;

var
ArrDataSer : array of ArrSeries; // массив серий

implementation

// функция возвращается серию данных с шагом дискретизации incr
Function ArrSeries.AddPointSeries(Incr : integer);
var
i : Integer;// счетчик
series : TLineSeries;// временная серия для заполнения данными

Begin

Series:=TLineSeries.Create(form1.ch art1);// создание серии
series.Color:=Color;// Цвет серии

for I := 0 to Count-1 do
if i mod incr=0 // шаг вывода точек в серию
then series.AddXY(DataX[i],DataY[i])// добавление точек в Series

result := series;
series.Free;// освобождаем временную переменную

end;

Последний раз редактировалось grebljmax; 05.10.2013 в 12:58.
grebljmax вне форума Ответить с цитированием
Старый 05.10.2013, 13:29   #10
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...проблема стара, а виноватят все tchart

http://programmersforum.ru/showpost....27&postcount=9
http://programmersforum.ru/showpost....2&postcount=11

Цитата:
и добавления, а решить проблему через видимость точе
нет, потому что в хранилище tchart-а они все равно память жрать будут.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определение скорости по видеосигналу N0Faceg Помощь студентам 7 24.04.2013 14:16
WiFi увеличение скорости misher Компьютерное железо 2 09.05.2011 23:38
Индексирование таблиц и увеличение скорости работы CodeNOT PHP 3 29.04.2011 11:57
С++ под Linux увеличение скорости работы с болванкой Yulka Помощь студентам 0 16.12.2009 21:42
Уменьшение загрузки ЦП и увеличение скорости программы. Shadow_1329 Gamedev - cоздание игр: Unity, OpenGL, DirectX 80 18.08.2009 15:22