我正在做一个项目,我正在使用 MsChart 绘制时间点。我的问题是随着时间的推移,MsChart 失去了速度。我每秒更新 127 个点。(128Hz)这是我最坏的情况。时间尺度和间隔是固定的。我观察到的是 MsCHart 在每个点更新上重新绘制完整图(这是一个开销) 是否有任何选项可以将其更改为部分更新或仅更新新点?
提前致谢。
我不知道只刷新 ChartArea 的一部分。但是,我使用一些技巧来优化图表:
枚举:
SeriesChartType.FastLine
SeriesChartType.FastPoint
.SuspendUpdates()
and.ResumeUpdates()
方法应用于 Series 集合:例子:
myChart.Series.SuspendUpdates();
// Adding points
...
myChart.Series.ResumeUpdates();
如果它不够好,那么您的要求可能超出了 MsChart 的能力。
在这种情况下,我建议切换到ZedGraph库。它很旧,但在足迹和性能方面仍然是最好的,它从未让我失望。
编辑
因为我很惊讶 ZedGraph 给了你糟糕的结果,所以我在这里放了一个快速而肮脏的zedgraph 样本,它会尽力满足你的要求:
只需将其复制/粘贴到 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();