求助:怎么解决用MSCHART控件画图时,数据量大而造成卡顿的问题?

TinkerFlying 2016-05-24 01:03:23
本人现在参与一个项目的开发,其中有用到MSCHART来实时画脑电波图。由于是脑电波图所以数据量相对来说很大(可能2毫秒就一个点,而屏幕一次性显示30-60秒的数据)
然后问题就来了,当屏幕上数据点很多之后再往图表上添加数据点就能明显的感觉到卡顿的情况。(调试状态时测试时间发现有的时候画一次点要0.3-0.4秒)。
同时当电波画满屏幕要清空屏幕的时候整个清空点的速度超级慢,用的是series.points.clear()函数来清空图表,调试的时候发现清空一次30秒的数据足足花了1.0+秒

希望有高手能点明一下能怎么解决,感谢!

PS:画点用的是ADDXY函数,然后没有新建立线程进行画图与清空
...全文
1182 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
财大前校草 2016-06-23
  • 打赏
  • 举报
回复
我也碰到了 这种情况 数据点是 10万数量级的 请问楼主这个问题解决了吗 我是做历史数据显示 得显示所有的点 数据量一大 我在鼠标move事件里画游标线 就变得卡顿了
TinkerFlying 2016-05-25
  • 打赏
  • 举报
回复
十分感谢@以专业开发人员为伍 的回答,的确点出了很多我没有考虑到的问题。 但是我有两个疑问: 1.“抽点”显示的时候怎么判定哪些点不会显示。(我的理解是如果某点位于两点所练成的直线上则不用显示该点,但是这个判断岂不是会很麻烦和耗时) 2.我在检查我的代码的时候发现了一个似乎是很致命的问题,就是我将有些变量的定义放在了循环语句中(比如每个画点都需要计算增幅值,而我循环每个点时都int了一个scope变量,其实本可以只在循环的开始int一个scope,然后再不断修改其值),这样写是不是不太不应该,并且也是导致我卡顿的原因专一
  • 打赏
  • 举报
回复
这类实际系统容易产生一个设计bug是在 I/O 上(收发数据以及数据库操作)占用了大量 CPU 时间。如果这时这个电脑再来绘图,就不好了。
  • 打赏
  • 举报
回复
关于所谓“线程”,由于我们一般来说的图形展示前置机要处理级频繁的数据接收发送任务,而且甚至要频繁做一些统计计算,所以那些“在家里玩绘图”的基本代码是不能照搬的。有关数据收发、计算、保存等等操作,都要仔细安排线程,既不要把不必要的任务放到主线程中去执行,也不要滥用线程。甚至你可能需要对系统“极端地”重构,例如可能要求传来的数据必须是计算好的“傻瓜”数据,而不允许是任何需要计算的数据。 “没有新建立线程进行画图与清空”这个话其实是多余的话,因为你也不可能建立子线程去做这些底层工作,这些底层工作必须注册给主线程来执行。但是你强调这一点,反而说明你可能有应该放到子线程的任务都丢给主线程去阻塞着去做了。
  • 打赏
  • 举报
回复
随便说几点重点,这些重点任何一个都不应该忽视: 1. 当内容刷新移动时,已经移除视图的点(例如向左滚动时的左边多余的点),你应该从绑定给图像的数据源上删除。 2. 当点密集时,你必须先“抽点”再显示。不要显示不必要的点。 3. 如果你的控件有“暂时禁止渲染”指令,那么应该使用。你应该是在修改数据之前停止渲染,然后在设置完毕新数据之后才启动。
TinkerFlying 2016-05-24
  • 打赏
  • 举报
回复
引用 1 楼 lnjlnj2012 的回复:
不知道你使用什么技术,一般绘制这种可以使用GDI+,每屏刷新显示是速度是很快.你使用双缓冲技术自己绘制吧,使用MSCHART不够灵活.
首先谢谢你的答复。我才学C#与WINFORM没多久所以不知道GDI+于是就用MSCHART画图了(主要是这个也方便)。刚刚搜索了解了下GDI+,如果用GDI+画这种折线图是不是要考虑诸如各种坐标的问题。。然后在不同的屏幕上适应起来岂不是一个大的问题。。 还有,个人感觉需要实时显示的数据用双缓冲技术似乎不太合适吧。。
天长地久2012 2016-05-24
  • 打赏
  • 举报
回复

象我这种绘制,一屏一屏刷新是相当快,也不占CPU,内存也少
天长地久2012 2016-05-24
  • 打赏
  • 举报
回复
不知道你使用什么技术,一般绘制这种可以使用GDI+,每屏刷新显示是速度是很快.你使用双缓冲技术自己绘制吧,使用MSCHART不够灵活.

111,119

社区成员

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

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

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