zoukankan      html  css  js  c++  java
  • WPF画线问题,几千条以后就有明显的延迟了。

     

    我现在是这么画的,class A
    {
    private GeometryGroup _lines;
    private Path _path;
    public A()
    {
       _path.Data = _lines;
    }
    public Draw()
    {
      LineGeometry line = new LineGeometry(p1, p2);
      _lines.Children.Add(line);
    }
    }一开始的速度很好,但是线多了以后,就有明显的延迟了。
    有什么更快速的方法不?

    解决方案 »
    1. Actipro WPF Studio 組件是wpf最快的

    2. 程序应该没问题吧。
      就是当Children的内容达到上万条以后,效率就会明显的下降。
      我看了一下,Children属性返回的应该是个IList类型,不存在超过预分配的最大值,就重新分配数据的问题吧?
      而且我把预定义的最大容量设到10万100万,还是没有很好的改善。

    3. 这个问题有人能给点思路吗?
      我已经把WPF下所有能画线的方式基本都试过了,效果还是不太理想。
      1,直接在Canvas下Children.Add(Line),慢。
      2,在Canvas下Children.Add(Path),然后Path.Data=GeometryGroup,然后GeometryGroup.Children.Add(LineGeometry), 慢。
      3,不使用GeometryGroup,改用据说性能更好的StreamGeometry,慢。
      4,使用DrawingVisual,然后用DrawingContext画图,
      效果很奇怪,context.DrawGeometry(null, new Pen(_brushes[i], 1), line),这种方式比较快(说实话,还是不理想,勉强凑合)
      但是我不用new Pen的方式,直接在类里面,定义好一个Pen _pen = new Pen(),然后context.DrawGeometry(null, _pen, line),这种方式的速度跟上面几种方法效果一样。
      按道理不用每次都new Pen,应该快才对啊。我被这个问题快搞死了,是不是无解啊?

    4. 就说明问题不是出在new的过程中,new的速度相当快的

    5. 可是在Winform下,画几千条一点延迟都没有。关键在于WPF是保留模式画图,而winform是立即模式画图。
      在Winform下,每次我只画一条线,如果刷新的话,就把所有线都画一次,一般画图时不会刷新,所以画图速度很快。
      但是在WPF下,每次画图,都是要Add一个对象进去,就这个差别导致数量多了以后,每次add一个对象都会比较慢。实在想不到在WPF下解决这个问题的办法。

  • 相关阅读:
    C#编写的windows程序随系统启动
    CentOS 6.0修改ssh远程连接端口
    C# 控件缩写大全+命名规范+示例
    记录点滴
    C++封装,继承,多态,友元
    策略模式
    OpenGL入门
    C++四种类型转换
    观察者模式Observer Pattern
    双向链表std::list和单向链表std::forward_list
  • 原文地址:https://www.cnblogs.com/xpvincent/p/3772173.html
Copyright © 2011-2022 走看看