Повышение производительности графических диаграмм с высокими скоростями передачи данных - PullRequest
5 голосов
/ 18 мая 2011

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

Одна идея, которая у меня возникла, состоит в том, чтобы изменить количество вызовов отрисовки с зависимости от количества точек данных до количества доступных пикселей. Я мог бы разделить данные на ячейки по оси X и нарисовать вертикальную линию между минимальным и максимальным значениями для каждой ячейки.

Ответы [ 5 ]

5 голосов
/ 24 мая 2011

В блоге Visiblox есть хорошая статья о здесь .

.

Возможно, вы не используете эту конкретную библиотеку графиков в своем приложении, но основные положения статьи будут по-прежнему применимы. Все дело в тщательном выборе того, что нужно показать, когда. Основными пунктами статьи являются:

  • Внимательно рассмотрите тип серии использовать
  • Где возможно, установить явные диапазоны вкл. оси
  • Удаление точек, которые находятся за пределами экрана из DataSeries
  • Удалить генерацию данных из пользовательского интерфейса нить
  • Уменьшить или отключить анимацию
  • Тщательно продумайте количество данные и частота обновлений

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

3 голосов
/ 18 мая 2011

Вообще говоря, вы могли бы сделать несколько вещей:

  • Дельта-обновления. Только перерисовать биты графика, где данные изменились. Например, вы можете просто перевести пиксели на графике влево и нарисовать только свежие данные, а не перерисовывать все целиком.
  • Пример данных. Как вы описываете, ваши данные могут быть настолько плотными, что не имеет смысла рисовать каждую точку. На основании уровня масштабирования графика вы можете отбросить некоторые точки данных.
  • Перерисовка на основе частоты кадров устройства, а не скорости передачи данных. Нет смысла перерисовывать график быстрее, чем его можно отобразить, не ставьте в очередь другую перерисовку, если она уже выполняется. Это может засорить очередь сообщений, от которой зависит большинство интерфейсов, и привести к заиканию интерфейса.

Между прочим, неплохой трюк - нарисовать векторную линию с некоторым количеством точек, которые будут отражать разрешение вашего графика (например, количество горизонтальных пикселей), тогда вы можете получить данные, перемещающиеся через вектор точек. в строке, похожей на очередь, где вы смещаете элементы «влево» перед добавлением новой точки данных. В терминах Wpf это приведет к «виртуализированному» графику, означающему, что элемент пользовательского интерфейса является постоянным и анимированным экземпляром, а не повторным созданием экземпляра при поступлении новых данных.

Противоположным примером будет добавление новой векторной линии между последней точкой и новой точкой при появлении новых данных. (Я предполагаю, что используется графический интерфейс высокого уровня, где линии / фигуры являются незаметными объектами, если нет, то «виртуализация» на самом деле не применима)

2 голосов
/ 18 мая 2011

Если вам нужно иметь хорошую производительность во время манипуляций с пользователем, вы можете сделать следующее:

  1. Когда пользователи запускают взаимодействие с диаграммой, создайте ее упрощенную версию, скажем, вмаксимум 30 точек данных будут присутствовать на этом графике.
  2. Позвольте пользователю завершить свою манипуляцию
  3. Заполнить диаграмму всеми точками данных (здесь вы также можете использовать алгоритм выборки, так какне имеет смысла отображать больше точек, чем разрешение экрана)

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

0 голосов
/ 21 декабря 2011

Раскрытие информации: Я владею программным обеспечением ABT и принимал непосредственное участие в разработке SciChart

К сожалению, нет диаграмм на основе WPF с использованиемГрафический конвейер с сохранением режима способен справляться с сценариями с большим количеством данных.В результате я создал высокопроизводительный компонент диаграммы WPF / SL под названием SciChart , чтобы справиться с такими сценариями.SciChart стремится заполнить пробел в сверхвысокой производительности научных / биржевых диаграмм и в рамках своей оптимизации использует собственные алгоритмы передискретизации, чтобы уменьшить набор данных перед рисованием.

В ответ на ваш вопрос я бы предложил взглянутьв теории Частота Найквиста (используется в цифровой обработке сигналов).Это говорит о том, что минимальное количество точек данных, необходимое для точной дискретизации формы сигнала, в 2 раза превышает частоту дискретизации.Например, в случае звукового сигнала частота дискретизации 44 кГц (для аудио компакт-дисков) может точно представлять максимальную частоту Fs / 2 или 22 кГц.В случае диаграммы частота Найквиста составляет 2x ширину пикселя - это минимальное количество точек данных, необходимых для точной дискретизации частот вплоть до ширины пикселя включительно.

Обратите внимание, что это минимальный минимум, и вы получите aliasing .Чтобы обойти это, вам понадобится фильтр сглаживания перед этапом повторной выборки и / или вам понадобится большее количество точек.

Алгоритмы пересэмплирования достаточно хорошо известны и доступны быстрые реализации.Я бы посоветовал изменить выборку на кратность ширины вашего пикселя и применить AA, чтобы получить наилучшие результаты.

0 голосов
/ 18 мая 2011

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

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