WPFでルートプランナープログラムを作成していますが、数万のエッジを持つグラフオブジェクトであるマップを表示する必要があります。このマップ(ズーム、移動、エッジの選択など)も操作したい場合、これらの線を描画するための最良のオプションは何でしょうか?私が試したすべてのオプションは、レンダリングパフォーマンスが非常に遅いことが判明しました。
3 に答える
Shapeを使用して、これらのオブジェクトを操作するのは特に簡単ですが、何千ものエッジを処理する場合は、画面にベクターグラフィックをレンダリングするために使用できるビジュアルオブジェクトであるDrawingVisualクラスとそのRenderOpenメソッドを使用することをお勧めします。 。私はあなたと同様の問題を抱えており、 DrawingContextを使用してエッジを描画することでアプリケーションのパフォーマンスを向上させました。
ズームするには、変換、特にScaleTrasnformを操作して、パネルまたは形状に変換を適用する必要があります。
DrawingVisualはイベントハンドリグを提供しないため、Shapeでイベントを使用してエッジを操作できる場合は、DrawingVisualでヒットテストを実装する必要があります。
描画パフォーマンスを向上させるには、すべての線を一度にレンダリングしないようにする必要があります。低レベルのビジュアルを使用しても、パフォーマンスを向上させることはできません。
あなたはこれらのことに従う必要があります:
- これらの線が1つのレイヤーにある場合は、そのレイヤーを別のレイヤーに分割します。高速道路、高速道路、地方道路、道路などに関連する線に基づいてそれらを分割できます。
- これらのレイヤーに空間的にインデックスを付けるメカニズムを見つける必要があります。空間インデックスを使用すると、境界ボックスに従ってラインにインデックスを付けることができます。
- バウンディングボックスのベースに線を取得し、そのバウンディングボックスにある線のみをレンダリングします
- 重要な線(高速道路、高速道路)をより高いズームレベルでレンダリングしてから、地図を拡大して他の線(重要度の低い道路、道路)を徐々に表示します。
WPFを使用する必要がある場合は、DrawingVisualクラスを確認してください。これにより、低レベルの描画プリミティブにアクセスできるようになり、パフォーマンスが向上します。ただし、低レベルのオブジェクトを処理する場合は、フォーカスやヒットテストなどを自分で処理する必要があります。DrawingVisualsのmsdnエントリについては、こちらをご覧ください。
http://msdn.microsoft.com/en-us/library/system.windows.media.drawingvisual.aspx http://msdn.microsoft.com/en-us/library/ms742254.aspx