0

を使用する以外に、WPFで線を描画するより効率的な方法はありますか?

DrawingContext.DrawLine(pen, a, b); ?

私のアプリケーションでは多くの線画を描いていますが、99%の時間がこの呼び出しを行うループに費やされています。

[a、b]は、絶えず変化している非常に多くのポイントのリストから来ています。入力フィードバック/イベントなどは必要ありません...ポイントを非常に速く描画する必要があります。

助言がありますか?

4

3 に答える 3

2

ペンをフリーズしてみてください。これがフリーズ可能なオブジェクトの概要です。

于 2012-11-12T08:02:09.640 に答える
1

この質問は本当に古いですが、DrawingContext.DrawLine を使用するコードの実行を改善する方法を見つけました。

これは、1時間前に曲線を描くための私のコードでした:

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();

古いコードでは、3000 ポイントの 2 つの曲線をプロットするのに約 140 ミリ秒かかりました。新しいものは約5ミリ秒かかります。StreamGeometry を使用すると、DrawingContext.Drawline よりもはるかに効率的です。

編集: dotnet フレームワーク バージョン 3.5 を使用しています

于 2014-10-13T11:33:33.363 に答える
0

StreamGeometryが適しているようです。凍結しなくても、パフォーマンスは向上します。

于 2012-11-13T19:37:45.317 に答える