C# chart 控件实时刷新60000个数据点卡得出不来图

baidu_37617089 2018-08-29 10:24:40
C# 建了个窗口放进去个自带的chart控件,然后cs文件里面去实时读取数据,在chart里面显示。
读取没问题,非常快就存进数组里面了,然后我用
chart1.Series["data"].Points.Clear();
chart1.Series["data"].Points.DataBindXY(x_point, y_point);

当数据很少的时候(几千个),大概延时1秒左右就出来了,可是我实际上需呀60000个左右的数据,这时候等个几分钟都出不来,一直卡在DataBindXY这里。

我也试过用线程,可是DataBindXY在线程里面用不了。

请问该怎么做让chart控件能快点出来图,又或者有什么免费的图表控件可以使用。我之前用了葡萄城的试用版,里面的chart控件倒是能很快出来,现在试用版到期了,用不了了。
...全文
2972 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
椰壳里的海 2021-04-26
  • 打赏
  • 举报
回复
引用 15 楼 非专业开发Five的回复:
[quote=引用 14 楼 椰壳里的海 的回复:]楼主,卡顿现象是因为数据量大后,屏幕重绘时的时间延迟造成的,就是显示器速度与cpu速度不一致引起。看看我的贴子可能对你有用。
你这为了推控件挖坟过分了啊[/quote] 你可以做一些商业开发,大家相互协作。
椰壳里的海 2021-04-26
  • 打赏
  • 举报
回复
引用 15 楼 非专业开发Five的回复:
[quote=引用 14 楼 椰壳里的海 的回复:]楼主,卡顿现象是因为数据量大后,屏幕重绘时的时间延迟造成的,就是显示器速度与cpu速度不一致引起。看看我的贴子可能对你有用。
你这为了推控件挖坟过分了啊[/quote] 无所谓,但可以解决你的问题。
  • 打赏
  • 举报
回复
引用 14 楼 椰壳里的海 的回复:
楼主,卡顿现象是因为数据量大后,屏幕重绘时的时间延迟造成的,就是显示器速度与cpu速度不一致引起。看看我的贴子可能对你有用。
你这为了推控件挖坟过分了啊
椰壳里的海 2021-04-26
  • 打赏
  • 举报
回复
楼主,卡顿现象是因为数据量大后,屏幕重绘时的时间延迟造成的,就是显示器速度与cpu速度不一致引起。看看我的贴子可能对你有用。
  • 打赏
  • 举报
回复
引用 3 楼 baidu_37617089 的回复:
[quote=引用 1 楼 xuzuning 的回复:]
屏幕横向也就一千多个点,你放上 60000 个数据,能看的清楚吗?
既然看不清,又何必放那么多?


因为一次采集上来就是60000左右个点,然后我用折线图连起来,我也想过除以十,每10个点用,可是后面要找峰,我担心前面简化了,后面找峰会不准不对。用商用控件就很快就出图,奈何过期了。[/quote]
你这样就是把前后弄混了。
1、整个图表要找到峰谷。
2、数据多要做数据筛选。
3、未来可能有放大缩小的功能。

那么你要做的就是:
在每次放大缩小前,先找到峰谷,然后开始筛选数据(10选1或者怎么做你自己安排),在峰谷数据附近加入峰谷数据,然后展示筛选后的数据即可。
xuzuning 2018-08-29
  • 打赏
  • 举报
回复
抽样,10个一抽甚至60个一抽。图形指示反映趋势,并不影响你去计算峰值
wanghui0380 2018-08-29
  • 打赏
  • 举报
回复
主要看你是什么数据,如果是时间序列数据,我们正常采用汉明窗口按时间窗口提取显示

如果是空间数据,通常是按空间比例再次抽样
我是小数位 2018-08-29
  • 打赏
  • 举报
回复
我以前有个需求要分析电线的波形频率图,每条线有2000个点,每次分析大概控制在一百条线以下,基本在50条左右,这样算起来也有
2000*50=100000点 ,我是自己用gdi画的,很快
baidu_37617089 2018-08-29
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
屏幕横向也就一千多个点,你放上 60000 个数据,能看的清楚吗?
既然看不清,又何必放那么多?


因为一次采集上来就是60000左右个点,然后我用折线图连起来,我也想过除以十,每10个点用,可是后面要找峰,我担心前面简化了,后面找峰会不准不对。用商用控件就很快就出图,奈何过期了。
xuzuning 2018-08-29
  • 打赏
  • 举报
回复
屏幕横向也就一千多个点,你放上 60000 个数据,能看的清楚吗?
既然看不清,又何必放那么多?
stherix 2018-08-29
  • 打赏
  • 举报
回复
没必要显示这么多点
按比例间隔取100,200之类的点数,形成新数组再bind
  • 打赏
  • 举报
回复
至于简化数据,提取变化趋势这些有太多的人做了太多的算法我就不班门弄斧了
  • 打赏
  • 举报
回复
事实上现在的屏幕分辨率就算是4K屏幕吧,也就4096×2160的分辨率,这个意思是指4K屏在极限情况下也最多只能展示4630个点的一条线(斜边)

而人眼可见的变动率你绘制到1000点就已经足够查看趋势了,因此你现在要做的第一步是将数据精简到一个合适的既可以展示趋势又可以快速渲染的一个平衡点上,然后再去做渲染。

当然你如果就硬要上这么多点也可以,GDI+多线程绘图操作是可以实现的,但是实际上并不会提升更多的用户体验,相反的因为你自己粗制滥造了一套图表多线程控件,很多用户功能的实现反而更加困难了。
  • 打赏
  • 举报
回复
说那么多举个栗子吧

原始数据:
1 2 3 4 0 4 5 6 2 5 5 9 8
你可以清洗为
1 3 0 5 2 5 8
然后加入筛出的峰值
1 3 0 5 2 5 9 8
也可以清洗为
1 4 5 5 8
加入筛出的峰谷值
1 4 0 5 5 9 8

你想精简中间多少数据精简多少,你想取平均值订正数据也可以,我这边就不举栗了。
做法就是开头结尾你都有,然后有峰谷即可。

xian_wwq 2018-08-29
  • 打赏
  • 举报
回复
引用 8 楼 baidu_37617089 的回复:
谢谢大家,现在我把数据10个一合并,缩到6000个点了,图出来了,可是有点卡,大概2秒才能出一次图,有时候憋了10多秒才出,怎么办了?

按照现有的屏幕分辨率,显示6000个点或者1000个点,
客户的感觉并没有想象中差的那么多
接着再精简数据就能保证性能
思路楼上几位大神都说过了
这些点的选择有讲究,
是分时间段取特征点(开始,最大,最小,结束)得来的,
同时需要给用户提供局部放大的功能

xuzuning 2018-08-29
  • 打赏
  • 举报
回复
1000 个点就绰绰有余了,何苦难为自己
baidu_37617089 2018-08-29
  • 打赏
  • 举报
回复
谢谢大家,现在我把数据10个一合并,缩到6000个点了,图出来了,可是有点卡,大概2秒才能出一次图,有时候憋了10多秒才出,怎么办了?

110,572

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧