WPF画线问题,几千条以后就有明显的延迟了。

时间:2022-09-30 16:29:56

 

我现在是这么画的,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下解决这个问题的办法。