在WPF中绘制图元非常慢。如何提高?

时间:2013-11-19 14:04:04

标签: c# wpf

我正在编写类似CAD的应用程序,当缩小内容时需要显示数万行。

目前我使用C ++和Direct2D,它运行得非常顺利:我可以在16毫秒内绘制100000行。所以我知道我的(普通)机器可以处理它。

我正在尝试转向WPF,但我发现性能令人失望。使用下面的代码,重绘需要将近一秒钟(例如,当我调整窗口大小时)。

分析说瓶颈在[wpfgfx_v0400.dll]中的某个地方,但我看不出具体的功能。

所以我的问题:我做错了什么?如何提高下面代码的性能?

public partial class MainWindow : Window
{
    public MainWindow ()
    {
        InitializeComponent ();

        var gg = new GeometryGroup ();

        Random random = new Random ();
        for (int i = 0; i < 1000; i++)
        {
            Point p0 = new Point (random.Next (1000), random.Next (1000));
            Point p1 = new Point (random.Next (1000), random.Next (1000));
            var lineGeometry = new LineGeometry (p0, p1);

            gg.Children.Add (lineGeometry);
        }

        var stroke = new SolidColorBrush (Colors.Red);

        gg.Freeze ();
        stroke.Freeze ();

        this.Content = new Path () { Data = gg, Stroke = stroke };
    }
}

1 个答案:

答案 0 :(得分:1)

在WPF中绘制内容比您预期的要慢!一般来说,1000点的线不应该是一个问题,但我不希望使用WPF几何图元绘制任何接近100000点的位置 - 相反,您最终必须下拉到光栅化自己或使用一些原始的DirectX嵌入在您的WPF应用程序中。

具体而言,单线1000点的情况应该在理性的范围内,有些想法:

  • 对于随机数据,如果线来回覆盖很多区域,这可能会导致一些非常难看的性能。这不仅仅是创建一个大面积重绘的情况 - 来回往往会导致WPF几何形状出现一些不好的情况

  • 如果您要绘制一行,请尝试在PolyLine

  • 中使用PolyLineSegmentPath
  • 如果您确实需要多个断开的行,而不是GeometryGroup满的LineGeometry,请使用Path多个PathFigure。< / p>

对于其他答案所指出的一般情况,您可以查看OnRenderDrawingVisual类型的方法,具体取决于您的表现可能会有所改善,也可能不会更好。我认为除非你可以进行某种虚拟化,否则你仍然会对你建议的元素数量感到困惑。