Улучшение производительности WPF Canvas - PullRequest
8 голосов
/ 27 сентября 2011

Я разрабатываю приложение, похожее на Карты, с использованием WPF.У меня ~ 10000 PathGeometry, фигуры добавлены на холст.Я добавил ScaleTransform и TranslateTransform для элементов управления масштабированием и панорамированием.

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

Любые советы по повышению эффективности будут полезны и оценены.

Ответы [ 3 ]

7 голосов
/ 27 сентября 2011

Предлагаю вам взглянуть на эту интересную статью с концепцией Virtual Canvas: ZoomableApplication2: Million Items .Он также имеет живую (xbap) демо онлайн.

6 голосов
/ 27 сентября 2011

Какие вещи вы кладете на холст?Если вы используете pathGeometry, заключаете ли вы их в класс Path?Если это так, у Path есть FrameworkElement в иерархии суперклассов, который отвечает за значительную потерю производительности.

Взгляните на мой вопрос здесь. Хотя речь идет о классе Shape, но причинаснижение производительности - то же самое, FrameworkElement.

Если вы делаете это, решение состоит в том, чтобы вместо этого использовать PathGeometry и заключить его в DrawingContext DrawingVisual с помощью метода DrawingContext.DrawGeometry ().

Вот несколько ссылок, которые должны помочь. Геометрия пути

DrawingContext.DrawGeometry ()

Оптимизация производительности: 2D-графика и изображения

И нарисуйте фигуры самостоятельно, используя комбинации линий и других вещей, предоставляемых классами, производными от класса Geometry (ArcGeometry, PathGeometry и т. Д.).

Это должно помочь.

2 голосов
/ 22 декабря 2011

Если вам нужна максимальная производительность для немедленного рисования в WPF, проверьте WriteableBitmapEx . Это отличная библиотека с открытым исходным кодом, в которую я недавно внес свой вклад. он обеспечивает GDI-подобные возможности рисования на WriteableBitmap и совместим с Windows Phone, WPF и Silverlight. API прост, вы получаете блиты, многоугольники, линии и простые формы и т. Д. Однако вы не получите шаблонов и градиентных кистей.

...