0

Graphics オブジェクトがリソースを使用する方法を知っていますか?

パネルに緯度経度座標を持つ数千の GraphicsPath オブジェクトを描画しています。最初に、これらの Graphicspaths をズームする必要があります (変換 - 実際には 4 つのマトリックス変換)。その後、ユーザーは、グラフィック パスを再描画するために呼び出される各アクションで、マップを移動したり、ズームしたりできます。

問題は、ズーム レベルが 2000 ~ 10000 程度のときは全体が応答することですが、数十万 (ストリート レベルのズーム) になると、ペイントに時間がかかりすぎて、アプリケーション全体が応答しなくなることです。空きメモリを確認してください。まだ十分あります。CPU使用率はまだOKです。

同じ 4 つのマトリックス変換を使用して同じ数千のグラフィックス パスを描画すると、ズーム ファクターを大きくすると、それぞれが非常に遅くなるのはなぜですか? Graphics Path 座標を多数扱う場合、System.Graphics 自体に問題がありますか? 皆さんは同じ問題に直面したことがありますか?

  • コードが含まれていないため、申し訳ありませんが、ここに「遅い」コードのチャンクがあります: 基本的に _paint メソッドの反復部分です。30,000 以上のグラフィックス パスを実行します。ほとんどは esri shp ファイルから抽出されたポリラインです。x の座標は + で y は - であり、上下逆になっているため、必要なマトリックス変換をパネルにペイントする必要があります。問題は低い値の変数 zI にあり、高い値の変数 zI よりもはるかに高速です。高値の zi は、グラフィックス パスの大部分がペイントされた領域の外にあることを意味します。isVisible をチェックするか、長方形の境界を交差させることで、zi の量を減らそうとします。しかし、それでも十分な速度ではありません。何か案は?

                foreach (GraphicsPath vectorDraw in currentShape.vectorPath)
                {
                    GraphicsPath paintPath = (GraphicsPath)vectorDraw.Clone();
    
    
                    OperationMatrix = new Matrix();
                    OperationMatrix.Translate(-DisplayPort.X, -DisplayPort.Y);
                    paintPath.Transform(OperationMatrix);
                    OperationMatrix = new Matrix();
                    OperationMatrix.Scale(zI, zI);
                    paintPath.Transform(OperationMatrix);
                    OperationMatrix = new Matrix(1, 0, 0, -1, 0, DisplaySize.Height);
                    paintPath.Transform(OperationMatrix);
    
                    OperationMatrix = new Matrix();
                    OperationMatrix.Translate(ClientGap.Width, -ClientGap.Height);
                    paintPath.Transform(OperationMatrix);
    
                    //if (WiredPort.IsVisible(paintPath.GetBounds())) //Futile attempt
                    //{
    
                    Pen LandBoundariesPen = new Pen(Color.FromArgb(255, 225, 219, 127));
    
                    GraphContext.DrawPath(LandBoundariesPen, paintPath); // this is the slowest part. When commented it goes faster.
    
                    pathCountX++;
                }
    

ヘルプ .... :)

4

1 に答える 1

0

高性能のレンダリングを行うには、WPF よりも directX を使用することをお勧めします。C# で opengl を使用することも検討できます。

編集: TAO フレームワークを介して C# で Open GL を使用する方法に関するチュートリアルについては、以下のリンクにアクセスしてください: http://xinyustudio.wordpress.com/2008/12/01/using-opengl-in-c-taoframework/

于 2013-04-04T12:48:00.853 に答える