none
如何能将这个程序的UI更新性能提升到极致? RRS feed

  • 问题

  • ■课题背景

    由于工作中经常要使用示波器来监控单片机的运行状况,但是示波器的价格太高,所以想试试能否用WPF来实现类似的功能。

     

    ■课题

    目前已经基本实现通过PC串口从单片机侧读取数据,由于要将数据转换成曲线图形后再更新到UI进行显示,考虑到整体性能问题

    于是在UI线程中启动了Timer(2ms)来读取Buffer中的数据。

     

    但是从实际运行效果来看,程序运行中曲线的更新还是有明显的停顿现象(尤其是点击界面中的Button时),也曾经试验过将超时

    间隔时间设置为20ms~500ms,但是也没有明显改善而且也达不到一个“示波器”所能达到的更新速度。

    也曾视图启动新的Thread来进行数据的更新,但是总提示与UI不在同一线程,因此不知道如何处理。

     

    无奈之下来这里求助,希望高手们能够给与些具体的思路与指点。

    2011年5月16日 11:43

答案

全部回复

  •             System.Windows.Threading.Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() => 
                {
                    // 在这里进行UI更新操作..
                }));

    just another day.
    2011年5月17日 11:09
  •             System.Windows.Threading.Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() => 
                {
                    // 在这里进行UI更新操作..
                }));

    just another day.

    这种方法(一般教程上都有的)都试验过,还是在点击按钮时有明显的延迟现象。(注:我刷新的时间间隔是2ms)

     

    另外还发现一点问题就是:第一次启动进行波形表示时图形刷新的速度较慢,但是点击某按钮重新载入图形刷新时会有明显的提速。

    如此反复多次的话,图形的刷新速度能够达到难以想象的效果。

    2011年5月17日 13:15
  • 那你能不能做一个DEMO.. 模拟数据接口...而不是从单片机读数据... 看这样能不能重现延迟的问题..方便的话可以代码贴出来 .. 大家可以分析下..
    just another day.
    2011年5月17日 13:26
  • Demo我是做完了,但是怎么能发给你们?

    版主们(Bob Bao等大侠们)能否提供下mail地址?

    2011年5月18日 16:08
  • WPF设计的目标是为了更佳灵活而有创意的UI界面

    高性能图形仍然留给Direct3D或OpenGL来负责,如果楼主追求性能,应该考虑把其中对性能要求高的那一部分用DirectX或OpenGL来写

    2011年5月19日 5:07
  • WPF无解?
    2011年5月23日 2:30
  • 不好意思,今天才看见。对于绘图,我建议用DrawingContext。好像今天你有一个新贴,和这个类似。

    还有,和IO交互的时候,不推荐用Timer来定时查询,而应该用异步调用,通过回调去实现更新,这样可以节省很多处理Timer的时间片。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年5月26日 9:45
    版主
  • 界于你最近几个帖子,我推荐你看看这个项目,很适合你的课题,一个示波仪的图标界面用: http://dynamicdatadisplay.codeplex.com/


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年5月26日 15:27
    版主
  • 界于你最近几个帖子,我推荐你看看这个项目,很适合你的课题,一个示波仪的图标界面用: http://dynamicdatadisplay.codeplex.com/


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    非常感谢你这几天的耐心回复,关于你提到的上面的项目使用起来还是有点不尽人意的地方,所以我打算自己来完成坐标系及图形的实现。

    但是在这之前,我想让你帮我确认一下我目前实现的软件结构是否有问题,同时也希望你能够帮助指出应该如何修改(比如另一个帖中提到

    的利用Callback的方式实现等等。。。)

     

    下面是我做的一个Demo,已经不用Timer来实现数据的获取了(数据暂时用静态数据来模拟串口接收),但是不知道这么做是否合理,求教。

    http://cid-5c8533b423e545ab.office.live.com/self.aspx/%E5%85%AC%E5%BC%80/MonitorDemo.zip

    再次感谢你的帮助,谢谢!



    2011年5月30日 3:08
  • 你好,

    看了下你的项目,结构没有什么问题。主要是你需要实时显示数据而且会用到大量的图形,所以我建议你对于图形开启 BitmapCache, 参考这篇博客:http://blogs.msdn.com/b/llobo/archive/2009/11/10/new-wpf-features-cached-composition.aspx

    还有文档:http://msdn.microsoft.com/zh-cn/library/system.windows.media.bitmapcache.aspx

     

    说到回调,其实我想到的是串口通信中的功能。.Net的串口通信组件 SerialPort.DataReceived 事件。可以通过注册事件来响应数据的接受,甚至通过一个独立的线程来接受数据,这样可以保持UI线程的独立。

    Sincerely,


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年5月30日 16:43
    版主
  • 1,我记得windows下的计时器,即便设置间隔是1,还是需要15MS才能收到一个WM_TIMER消息(也许是50MS)记不清了(98系统的话,间隔更大)。

    2,用SerialPort来处理串口效果很不错。(无论是Invoke或者BeginInvoke方式在WPF下似乎效果都不错,但是在Winform下,当串口数据很快时,BeginInvoke会导致界面更新慢。)

    3,就我目前的应用来说,我们大概是每0.9毫秒左右收到一包数据,然后在界面上用图形方式显示出来,效果很好。

    4,我现在遇到的问题是,当界面上出现上万条线段的时候,WPF画线会有延迟。(至今未解决,能使用的画图方式基本都用过了...)

    2011年6月21日 6:00