我正在 WPF 中制作路线规划器程序,我需要显示一个地图,该地图是具有数万条边的图形对象。如果我还想与此地图交互(例如缩放、移动、选择边缘),那么绘制这些线的最佳选择是什么?我尝试过的所有选项都导致渲染性能非常慢。
3 回答
您可以使用Shape,与这些对象交互特别简单,但如果您正在处理数千条边我建议使用DrawingVisual类,一个可用于在屏幕上渲染矢量图形的可视对象,以及它的 RenderOpen 方法. 我遇到了与您类似的问题,并且我使用DrawingContext来绘制我的边缘提高了我的应用程序的性能。
要缩放,您必须使用转换,特别是ScaleTrasnform并将转换应用于您的面板或形状。
DrawingVisual 不提供事件处理,因此如果使用 Shape 您可以使用事件与边缘交互,使用 DrawingVisual 您需要实现Hit-Testing。
为了提高绘图性能,您必须避免一次渲染所有线条。即使使用较低级别的视觉效果,您也无法提高性能。
你必须遵循以下几点:
- 如果您在一层中有这些线,则将该层拆分为不同的层。您可以在与高速公路、高速公路、地方道路、街道等相关的线的基础上拆分它们。
- 您必须找到对这些图层进行空间索引的机制。通过使用空间索引,您可以根据边界框对线进行索引。
- 在边界框的基础上获取线,并仅渲染位于该边界框内的线
- 在更高的缩放级别上渲染重要的线(高速公路,高速公路),然后在放大地图时逐渐显示其他线(低重要性的道路,街道)。
如果您必须使用 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