Я не знаю, как обновить только часть 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