Я создаю программу планировщика маршрутов в WPF, и мне нужно отобразить карту, представляющую собой объект графа с десятками тысяч ребер. Что было бы лучшим вариантом для рисования этих линий, если я также хочу взаимодействовать с этой картой (например, масштабировать, перемещать, выбирать края)? Все варианты, которые я пробовал, оказались очень медленными при рендеринге.
Быстрое рисование карты с тысячами строк в WPF
Ответы (3)
Вы можете использовать форму, взаимодействовать с эти объекты особенно просты, но если вы имеете дело с тысячами ребер, я предлагаю использовать DrawingVisual, визуальный объект, который можно использовать для визуализации векторной графики на экране, и его метод RenderOpen. У меня была проблема, аналогичная вашей, и я улучшил производительность своего приложения. используя DrawingContext для рисования краев.
Для масштабирования необходимо работать с преобразованиями, в частности ScaleTrasnform и примените преобразование к панели или фигурам.
DrawingVisual не обеспечивает обработку событий, поэтому, если в Shape вы можете использовать события для взаимодействия с краями, в DrawingVisual вам необходимо реализовать Проверка попадания.
Чтобы улучшить производительность отрисовки, вы должны избегать одновременного рендеринга всех линий. Вы не сможете улучшить свою производительность, даже используя визуальные эффекты более низкого уровня.
Вы должны следовать этим вещам:
- Если у вас есть эти линии в одном слое, разделите этот слой на разные слои. Вы можете разделить их на основе линий, связанных с автомагистралями, шоссе, местными дорогами, улицами и т. д.
- Вы должны найти механизм пространственной индексации этих слоев. Используя пространственную индексацию, вы можете индексировать свои линии в соответствии с их ограничивающей рамкой.
- Получите линии на основе ограничивающей рамки и визуализируйте только те строки, которые лежат в этой ограничивающей рамке.
- Визуализируйте важные линии (автомагистрали, автомагистрали) с более высоким уровнем масштабирования, а затем постепенно отображайте другие линии (дороги с низким уровнем важности, улицы) при увеличении карты.
Если вам нужно использовать WPF, взгляните на класс DrawingVisual. Это дает доступ к низкоуровневым примитивам рисования, которые повышают производительность. Однако, поскольку вы имеете дело с объектами более низкого уровня, вам придется иметь дело с такими вещами, как фокусировка и проверка попаданий. Взгляните здесь на записи msdn в DrawingVisuals:
http://msdn.microsoft.com/en-us/library/system.windows.media.drawingvisual.aspx http://msdn.microsoft.com/en-us/library/ms742254.aspx