我的图表可以包含很多点数(10000 +) 当我缩放图表以查看屏幕中的所有点时,绘制它们需要一些时间
你能否给我一些优化建议,以便不画出所有要点
答案 0 :(得分:7)
我不是列出技术的专家,但我会通过“bucketing
”您的数据点来解决这个问题。
您的X axis
为time
,因此请确定当前图表大小的分辨率点。 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)
除了其他好的建议,我会
在其上做一些random-pausing,看看它是否花了很多时间做其他可以避免的事情,比如可能一直在分配新的点结构。
不是直接绘制到窗口,而是绘制到位图,然后将其复制到窗口。它总是看起来更快,有时甚至 更快。 (务必删除清除窗口背景的方法。)
答案 3 :(得分:0)
我遇到了严重的性能问题,数千个系列添加到图表而不是数千个点。对我有用的解决方案是Flyweight模式的味道:
在虚拟系列的最后,即,当系列的所有点都已添加并且是时候转到下一个点时,插入一个空点:
series.Points.Add(new DataPoint(0, 0) { IsEmpty = true });
希望能帮助某人。