Оптимизируйте график с 10000+ баллами - PullRequest
4 голосов
/ 20 апреля 2011

У меня есть график, который может содержать много точек (10000+). Когда я масштабирую график, чтобы увидеть все точки на экране, для их отрисовки требуется некоторое время

Scaled chart

Можете ли вы посоветовать мне некоторую оптимизацию, чтобы не рисовать все точки

Ответы [ 4 ]

7 голосов
/ 20 апреля 2011

Я не эксперт по перечисленным технологиям, но я бы решил это с помощью 'bucketing' ваших точек данных.

Ваш X axis равен time, поэтому определите точку разрешения для текущего размера диаграммы. То есть, если вы видите весь график, вам понадобится только точка данных per day, например. Если вы увеличиваете масштаб, вам может потребоваться точка per hour.

Теперь вы определили разрешение, просмотрите диаграмму и найдите все данные, которые существуют между точками разрешения, т.е. все данные, которые равны > 20th April 2011 at 4pm и <<code>20th April 2011 at 5pm, если вы используете почасовое разрешение.

В зависимости от типа данных, которые вы используете, определите, хотите ли вы average все данные, которые вы собрали, или найдите median (или какой-либо другой метод, такой как candle stick chart, чтобы показать максимальные / минимальные значения). В любом случае, выберите наиболее подходящий метод, повторите для всех точек и отобразите результат с новыми данными.

Надеюсь, это то, что вы имели в виду.

3 голосов
/ 20 апреля 2011

Похоже, вам следует использовать какой-то алгоритм уровня детализации (LoD) .

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

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

0 голосов
/ 10 июля 2012

Я столкнулся с серьезной проблемой производительности, когда на диаграмму были добавлены тысячи серий , а не тысячи очков.Решение, которое работало для меня, было разновидностью шаблона Flyweight:

  1. Вместо добавления 1000-й серии, добавьте только одну.серии виртуальных , т. е. когда все точки серии добавлены и пора переходить к следующей, вставьте пустую точку:
    series.Points.Add(new DataPoint(0, 0) { IsEmpty = true });
    

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 20 апреля 2011

В дополнение к другим хорошим предложениям, я бы

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

  2. Вместо того, чтобы рисовать прямо в окне, рисуйте в растровое изображение и копируйте его в окно. Это всегда выглядит быстрее, а иногда даже 1011 * быстрее 1012 *. (Обязательно заглушите метод, который очищает фон окна.)

...