2

我正在做一个项目,我正在使用 MsChart 绘制时间点。我的问题是随着时间的推移,MsChart 失去了速度。我每秒更新 127 个点。(128Hz)这是我最坏的情况。时间尺度和间隔是固定的。我观察到的是 MsCHart 在每个点更新上重新绘制完整图(这是一个开销) 是否有任何选项可以将其更改为部分更新或仅更新新点?

提前致谢。

4

1 回答 1

1

我不知道只刷新 ChartArea 的一部分。但是,我使用一些技巧来优化图表:

  • 首先,我使用最优化的 ChartType 来显示我的系列

枚举:

SeriesChartType.FastLine
SeriesChartType.FastPoint
  • 另外,在添加新点之前,我将.SuspendUpdates()and.ResumeUpdates()方法应用于 Series 集合:

例子:

myChart.Series.SuspendUpdates();

// Adding points
...

myChart.Series.ResumeUpdates();
  • 此外,调整 X 轴的最小最大范围以仅显示所有点的子集可能会有所帮助。

如果它不够好,那么您的要求可能超出了 MsChart 的能力。

在这种情况下,我建议切换到ZedGraph库。它很旧,但在足迹和性能方面仍然是最好的,它从未让我失望。


编辑

因为我很惊讶 ZedGraph 给了你糟糕的结果,所以我在这里放了一个快速而肮脏的zedgraph 样本,它会尽力满足你的要求:

  • 它在 RollingPointPairList(一个特殊的 FIFO 点列表)中处理 3600 个 128hz 点
  • 它每秒向图形添加 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();
于 2013-02-22T06:48:30.427 回答