用10000+点优化图表

时间:2011-04-20 13:36:24

标签: c# math optimization mschart

我的图表可以包含很多点数(10000 +) 当我缩放图表以查看屏幕中的所有点时,绘制它们需要一些时间

Scaled chart

你能否给我一些优化建议,以便不画出所有要点

4 个答案:

答案 0 :(得分:7)

我不是列出技术的专家,但我会通过“bucketing”您的数据点来解决这个问题。

您的X axistime,因此请确定当前图表大小的分辨率点。 IE,如果你看到整个图表,你只需要一个数据点per day。如果您放大了很长时间,可能需要一个点per hour

现在你已经确定了分辨率,浏览你的图表,找到分辨率点之间存在的所有数据,IE,所有> 20th April 2011 at 4pm和< 20th April 2011 at 5pm的数据。 average如果您按小时解决问题。

根据您使用的数据类型,将确定您是要median收集的所有数据点,还是找到candle stick chart(或其他一些方法,例如{ {1}}显示最大/最小值)。无论哪种方式,选择最相关的方法,重复所有点并使用新数据渲染结果。

希望这就是你的意思。

答案 1 :(得分:3)

好像你应该使用某种level of detail (LoD)算法。

例如: 始终使用最大给定点数来表示您的所有实际点数。通过计算local minima and maxima,您可以根据放大的距离为特定“细节”创建给定点集的正确表示。

计算这些极值仍然可能会很慢,因此您可能需要缓存它们。随着新数据的到来,您可以动态计算和缓存它。

答案 2 :(得分:0)

除了其他好的建议,我会

  1. 在其上做一些random-pausing,看看它是否花了很多时间做其他可以避免的事情,比如可能一直在分配新的点结构。

  2. 不是直接绘制到窗口,而是绘制到位图,然后将其复制到窗口。它总是看起来更快,有时甚至 更快。 (务必删除清除窗口背景的方法。)

答案 3 :(得分:0)

我遇到了严重的性能问题,数千个系列添加到图表而不是数千个点。对我有用的解决方案是Flyweight模式的味道:

  1. 不添加1000-s系列,只需添加一个。
  2. 虚拟系列的最后,即,当系列的所有点都已添加并且是时候转到下一个点时,插入一个空点:

    series.Points.Add(new DataPoint(0, 0) { IsEmpty = true });
    
  3. 希望能帮助某人。