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++; }
ヘルプ .... :)