Обновление части MsChart вместо полного обновления в С#

Я работаю над проектом, в котором я рисую точки со временем, используя MsChart. Моя проблема в том, что с течением времени MsChart теряет скорость. Я обновляю 127 точек в секунду. (128 Гц) это мой худший случай. Шкала времени фиксирована, как и интервал. Я заметил, что MsCHart перерисовывает полный график при каждом обновлении точки (что является накладными расходами). Есть ли возможность изменить это на частичное обновление или обновить только новую точку?

Заранее спасибо.


person Wakaley    schedule 22.02.2013    source источник


Ответы (1)


Я не знаю, как обновить только часть ChartArea. Тем не менее, я использую несколько советов по оптимизации графиков:

  • Во-первых, я использую наиболее оптимизированный ChartType для отображения в своей серии.

перечисление:

SeriesChartType.FastLine
SeriesChartType.FastPoint
  • Кроме того, я применяю методы .SuspendUpdates() и .ResumeUpdates() к коллекции Series, прежде чем добавлять новые точки:

Пример:

myChart.Series.SuspendUpdates();

// Adding points
...

myChart.Series.ResumeUpdates();
  • Кроме того, может помочь настройка минимального максимального диапазона оси X для отображения только подмножества всех точек.

Если он недостаточно хорош, то ваши требования, вероятно, превышают возможности MsChart.

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


ИЗМЕНИТЬ

Поскольку я удивлен, что ZedGraph дал вам плохие результаты, я поместил здесь быстрый и грязный образец zedgraph, который изо всех сил старается соответствовать вашим спецификациям:

  • Он обрабатывает 3600 точек с частотой 128 Гц в RollingPointPairList (специальный список точек FIFO).
  • Он добавляет 128 точек к графику каждую секунду.

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

Тем не менее, вы можете масштабировать, используя выделение мышью и колесико, или панорамировать, используя CTRL+щелчок, перемещая мышь, а затем посмотреть, соответствует ли производительность вашим ожиданиям.

var fq = 128; // Freq in hz
var maxDuration = 3600; // max duration in s

var zg1 = new ZedGraphControl();
zg1.Dock = DockStyle.Fill;
this.Controls.Add(zg1);

var myPane = zg1.GraphPane;
myPane.XAxis.Type = AxisType.Date;
myPane.XAxis.Scale.Format = "yyyy/MM/dd HH:mm:ss.mmm";

var list = new RollingPointPairList(maxDuration * fq);

var ran = new Random();
var getRandomValue = new Func<double, double, double>((min, max) => ran.NextDouble() * (max - min) + min);

var ts = DateTime.Now;

for (var i = 0; i < list.Capacity; i++)
{
    list.Add(new XDate(ts), getRandomValue(50d, -50d));
    ts = ts.AddMilliseconds(1000d / fq);
}

var myCurve = new LineItem("dots", list, Color.Red, SymbolType.None, 1);
myCurve.Line.IsOptimizedDraw = true;
myPane.CurveList.Add(myCurve);

zg1.AxisChange();
zg1.Invalidate();

var z = new Timer();
z.Interval = 1000;
z.Tick += (s, ev) =>
    {
        var points = myCurve.Points as RollingPointPairList;
        for (var i = 0; i < fq; i++)
        {
            points.Add(new XDate(ts), getRandomValue(50d, -50d));
            ts = ts.AddMilliseconds(1000d / fq);
        }

        zg1.Invalidate();
    };

z.Start();
person Larry    schedule 22.02.2013
comment
Привет, спасибо за ответ. Я уже использую fastline и suspendUpdate. Но все же это недостаточно хорошо. Глядя на ZedGraph. - person Wakaley; 22.02.2013
comment
Привет, я пробовал ZedGraph Работает хуже, чем MsCHart Можете ли вы предложить что-то еще. - person Wakaley; 22.02.2013
comment
Это очень удивительно. Вы уверены, что проблема заключается не в количестве отображаемых точек (уменьшите минимальный максимальный интервал по оси x, см. также), или это может быть поиск данных, который происходит до? - person Larry; 22.02.2013
comment
Моя проблема в том, что я не могу установить фиксированный минимум, все это контролируется пользователем во время выполнения. И допустимый диапазон для пользователя очень высок. (от 1 сек до 3600 сек). Это программное обеспечение в основном работает с устройством в режиме реального времени на частоте 128 Гц (что, по моему мнению, очень высоко для таких операционных систем, как Windows, поскольку это не в реальном времени). Хотя теперь я управлял дисплеем MsChart с помощью той же техники, которую вы предложили с алгоритмом самостоятельный выбор интервала suspendUpdate. - person Wakaley; 25.02.2013
comment
Я поделился образцом ZedGraph, стараясь изо всех сил соответствовать вашим требованиям. На первый взгляд это может выглядеть некрасиво, потому что я понятия не имею о минимальных максимальных значениях y ваших данных и использую случайное значение. Но игра с масштабированием и панорамированием возможностей zedgraph должна дать вам представление о том, как он может обрабатывать 460800 точек :) - person Larry; 25.02.2013
comment
ой, еще одно редактирование сделано: я забыл добавить myCurve.Line.IsOptimizedDraw = true; в коде. - person Larry; 25.02.2013