优化WPF DrawingContext.DrawLine

时间:2012-11-11 21:51:24

标签: wpf performance drawingcontext

除了使用

之外,是否有更有效的方法在WPF中绘制线条
DrawingContext.DrawLine(pen, a, b); ?

我在我的应用程序中进行了大量的线条绘制,并且99%的时间花在了一个循环中进行此调用。

[a,b]来自一个不断变化的大量积分。我不需要任何输入反馈/事件或类似的东西,......我只需要非常快速地绘制点。

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

你可以尝试冻结笔。以下是freezable objects的概述。

答案 1 :(得分:1)

这个问题真的很陈旧,但我找到了一种方法,可以改善我使用DrawingContext.DrawLine的代码的执行情况。

这是我一小时前绘制曲线的代码:

DrawingVisual dv = new DrawingVisual();
DrawingContext dc = dv.RenderOpen();

foreach (SerieVM serieVm in _curve.Series) {
    Pen seriePen = new Pen(serieVm.Stroke, 1.0);
    Point lastDrawnPoint = new Point();
    bool firstPoint = true;
    foreach (CurveValuePointVM pointVm in serieVm.Points.Cast<CurveValuePointVM>()) {
        if (pointVm.XValue < xMin || pointVm.XValue > xMax) continue;

        double x = basePoint.X + (pointVm.XValue - xMin) * xSizePerValue;
        double y = basePoint.Y - (pointVm.Value - yMin) * ySizePerValue;
        Point coord = new Point(x, y);

        if (firstPoint) {
            firstPoint = false;
        } else {
            dc.DrawLine(seriePen, lastDrawnPoint, coord);
        }

        lastDrawnPoint = coord;
    }
}

dc.Close();

现在是代码:

DrawingVisual dv = new DrawingVisual();
DrawingContext dc = dv.RenderOpen();

foreach (SerieVM serieVm in _curve.Series) {
    StreamGeometry g = new StreamGeometry();
    StreamGeometryContext sgc = g.Open();

    Pen seriePen = new Pen(serieVm.Stroke, 1.0);
    bool firstPoint = true;
    foreach (CurveValuePointVM pointVm in serieVm.Points.Cast<CurveValuePointVM>()) {
        if (pointVm.XValue < xMin || pointVm.XValue > xMax) continue;

        double x = basePoint.X + (pointVm.XValue - xMin) * xSizePerValue;
        double y = basePoint.Y - (pointVm.Value - yMin) * ySizePerValue;
        Point coord = new Point(x, y);

        if (firstPoint) {
            firstPoint = false;
            sgc.BeginFigure(coord, false, false);
        } else {
            sgc.LineTo(coord, true, false);
        }
    }

    sgc.Close();
    dc.DrawGeometry(null, seriePen, g);
}

dc.Close();

旧代码需要约140毫秒来绘制两条3000点的曲线。新的大约需要5毫秒。使用StreamGeometry似乎比DrawingContext.Drawline更有效。

编辑:我正在使用dotnet framework version 3.5

答案 2 :(得分:0)

似乎StreamGeometry是要走的路。即使没有冻结它,我仍然可以获得性能提升。