Быстрое рисование карты с тысячами строк в WPF

Я создаю программу планировщика маршрутов в WPF, и мне нужно отобразить карту, представляющую собой объект графа с десятками тысяч ребер. Что было бы лучшим вариантом для рисования этих линий, если я также хочу взаимодействовать с этой картой (например, масштабировать, перемещать, выбирать края)? Все варианты, которые я пробовал, оказались очень медленными при рендеринге.


person Lord Gamez    schedule 16.04.2012    source источник


Ответы (3)


Вы можете использовать форму, взаимодействовать с эти объекты особенно просты, но если вы имеете дело с тысячами ребер, я предлагаю использовать DrawingVisual, визуальный объект, который можно использовать для визуализации векторной графики на экране, и его метод RenderOpen. У меня была проблема, аналогичная вашей, и я улучшил производительность своего приложения. используя DrawingContext для рисования краев.

Для масштабирования необходимо работать с преобразованиями, в частности ScaleTrasnform и примените преобразование к панели или фигурам.

DrawingVisual не обеспечивает обработку событий, поэтому, если в Shape вы можете использовать события для взаимодействия с краями, в DrawingVisual вам необходимо реализовать Проверка попадания.

person gliderkite    schedule 16.04.2012
comment
Спасибо, я думаю, что я пойду с DrawingVisual. - person Lord Gamez; 17.04.2012

Чтобы улучшить производительность отрисовки, вы должны избегать одновременного рендеринга всех линий. Вы не сможете улучшить свою производительность, даже используя визуальные эффекты более низкого уровня.

Вы должны следовать этим вещам:

  1. Если у вас есть эти линии в одном слое, разделите этот слой на разные слои. Вы можете разделить их на основе линий, связанных с автомагистралями, шоссе, местными дорогами, улицами и т. д.
  2. Вы должны найти механизм пространственной индексации этих слоев. Используя пространственную индексацию, вы можете индексировать свои линии в соответствии с их ограничивающей рамкой.
  3. Получите линии на основе ограничивающей рамки и визуализируйте только те строки, которые лежат в этой ограничивающей рамке.
  4. Визуализируйте важные линии (автомагистрали, автомагистрали) с более высоким уровнем масштабирования, а затем постепенно отображайте другие линии (дороги с низким уровнем важности, улицы) при увеличении карты.
person Bilal Hashmi    schedule 16.04.2012
comment
Спасибо за идеи. Я постараюсь реализовать разные слои. - person Lord Gamez; 17.04.2012

Если вам нужно использовать 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

person Andrew Jones    schedule 16.04.2012