11

マッピングを実行する必要がある Win7 で Dotnet 4.0 アプリケーションを開発しています。マッピング アプリケーションとしては、高解像度のアンチエイリアス処理されたポリゴンのがらくたの負荷を出力します。現在、GDI+ と Direct2D の 2 種類のレンダリング出力をサポートしています。

GDI+ の出力は Direct2D よりも約 3 倍高速であるため、私は懸念しています。

どちらのレンダラーも AA を使用しています。Direct2D でオフにすると、スループットがいくらか改善されることがわかっています (GDI+ よりも約 2 倍悪くなります)。しかし、それは解決策ではありません。なぜなら、GDI+ でも AA をオフにすれば、そこでさらに優れたパフォーマンスを得ることができるからです。このベンチマークの目的では、私のレンダリング コードは簡単です。誰かが私に指摘して状況を改善できる恐ろしい間違いを犯したことを願っています.

_renderTarget.BeginDraw();

// Paint background.
RectF rf = new RectF(0.0f, 0.0f, renderTargetSize.Width, renderTargetSize.Height);
_renderTarget.FillRectangle(rf, _backgroundBrush);

// Draw polygons
foreach (GisTypes.Polygon polygon in _polygons)
{
    using (PathGeometry path = _factory.CreatePathGeometry())
    {
        using (GeometrySink sink = path.Open())
        {
            sink.SetFillMode(Microsoft.WindowsAPICodePack.DirectX.Direct2D1
                .FillMode.Alternate);

            Point2F[] points = Array.ConvertAll(polygon.Points,
                x => new Point2F((float)x.X, (float)x.Y));

            sink.BeginFigure(points[0], FigureBegin.Filled);

            for (int i = 1; i < points.Length; ++i)
            {
                sink.AddLine(points[i]);
            }

            sink.EndFigure(FigureEnd.Closed);
            sink.Close();
        }

        using (TransformedGeometry transformedPath = _factory.CreateTransformedGeometry(
            path, WorldToPage))
        {
            _renderTarget.FillGeometry(transformedPath, _fillBrush);
            _renderTarget.DrawGeometry(transformedPath, _borderBrush, 1.0f);
        }
    }
}

_renderTarget.EndDraw();

このサンプル コードでは、ポリゴンごとに 1 つのパスと 1 つの図形を使用しています。その理由は、GDI+ の実装をより厳密に反映しており、サンプル コードではなく実際のアプリケーションで、選択したポリオンのレンダリングを簡素化するためです。単一のパスと複数の図を使用できることはわかっています。そのように試してみましたが、わずかに高速ですが、一般的な問題に関係するほどではありません。

RenderTarget で変換を設定するのではなく、TransformedGeometry も使用しています。その理由は、ジオメトリを変換したいのですが、アウトラインを変換したくないためです。スケーリング ファクターによってアウトラインが完全に消えてしまうからです。

私が使用している特定のサンプル データでは、数百のポリゴンしかありませんが、各ポリゴンには数千のポイントがある可能性があるため、レンダリング中の複数の PathGeometry と TransformedGeometry の割り当ては問題ではないと思います (それらの多くはなく、PathGeometry と TransformedGeometry を 1 つだけ使用して既に試しましたが、違いはわずかでした)。

オフスクリーンの RenderTarget にレンダリングし、その結果をオンスクリーンの RenderTarget にブリッティングするべきではないかと考えましたが、Direct2D パフォーマンスの向上に関する MSDN の記事を読みましたが、最適化としてこれについて言及されていませんでした。

誰でもアイデアはありますか?

4

2 に答える 2

3

あなたの描画ルーチンは頻繁にリソースを作成していると思いますが、これは本当に時間がかかります。ジオメトリとシンクはデバイスに依存しないリソースであるため、変更されない限り作成して保持する必要があります。これらの変更は通常、描画するものを変更したり、ウィンドウを移動/サイズ変更したり、コンテンツをパン/ズームしたりするときに発生します。描画ルーチンは、既存のリソースのみを描画し、高速化する必要があります。

お役に立てれば。

于 2013-01-07T07:28:25.823 に答える