Вы можете попробовать использовать GDI + или direct x вместо WPF.
Я сделал аналогичный проект (рендеринг картографических данных через WPF) для статьи в журнале MSDN, которую написал около года назад.
Это было просто то, что я написал довольно быстро (статья + приложение заняло около 1 недели), и было разработано так, чтобы это было просто «это что-то изящное, что вы можете сделать», и поэтому я не особо сосредоточился на производительности , В любом случае я столкнулся с той же проблемой. Как только количество многоугольников на холсте стало большим, производительность рендеринга начала ухудшаться. Например, изменение размера окна потребует примерно 1/2 секунды или около того.
Многое из этого связано с накладными расходами WPF. Он в первую очередь разработан как инструментарий GUI, а не как высокопроизводительный графический движок. Это означает, что он фокусируется на богатстве функций по сравнению с эффективным рендерингом. С меньшим количеством объектов (что, вероятно, можно найти в большинстве приложений с графическим интерфейсом), производительность довольно хорошая, и функции привязки данных, анимации и декларативного стиля (а также вся маршрутизация событий и другие необходимые им вещи) действительно могут пригодиться .
Однако при рисовании карты объем данных может привести к тому, что все эти аккуратные функции привязки данных вызовут проблемы с перфорированием, как вам хорошо известно.
Если вам не нужны декларативные стили и анимация, тогда я бы просто исключил WPF и использовал GDI +, чтобы нарисовать карту самостоятельно. В основном это включает в себя настройку правильной матрицы преобразования, чтобы карта отображалась на управляющей поверхности, а затем итерацию по всем полигонам и вызов нескольких методов DrawPolygon.
Чтобы включить взаимодействие, вам нужно будет написать свой собственный код тестирования на попадание, и вам придется перерисовывать карту каждый раз, когда размер формы изменяется. Вам также придется вручную кодировать любые анимации, изменения стиля или другие подобные вещи (например, выделение областей, когда мышь над ними). Но не должно быть так сложно написать этот код. Я хотел бы, чтобы вы могли сделать это примерно через 1,5 недели.
Однако это должно повысить производительность, поскольку сводится к выполнению только около 20-30К векторных преобразований, которые не потребляют много ресурсов процессора на большинстве современных процессоров. Вы также можете изучить использование Direct X, которое позволит вам также использовать преимущества графического процессора, что может повысить производительность.