@HitGirl

Как оптимизировать рисование линий в WPF?

Здравствуйте!
Подскажите, пожалуйста, как оптимизировать рисование линий в WPF? Если добавлять точки в polyline в обработчике события OnMouseMove, Wpf начинает тормозить, когда в коллекции polyline несколько тысяч точек.
  • Вопрос задан
  • 433 просмотра
Пригласить эксперта
Ответы на вопрос 2
cyber_roach
@cyber_roach
UX дизайнер INEDIapps
От нескольких тысяч все что угодно будет тормозить
Направление указали уже вам, дополню:
Чтобы не скушать всю оперативу и проц
читайте про BitmapCache
https://docs.microsoft.com/ru-ru/dotnet/api/system...
и RenderTargetBitmap
https://docs.microsoft.com/ru-ru/dotnet/api/system...
в UWP кеширование на более верхнем уровне реализовано, там попроще, но в WPF тоже можно сделать хорошо.
Алгоритм вкратце:
2 слоя - верхний -там где тыкаете мышкой
и нижний - кеш
Добавили линию (на верхнем слое) - рендерите в картинку (верх+низ) - отрисовываете эту картинку на нижнем слое (например через ImageBrush), линию на верхнем удаляете.
Т.е. как только пользователь закончил фигуру/действие - кешируете.
Если нужен интерактив на уже нарисованном (например узлы точек подсвечивать), тут сложнее, но тоже возможно (запоминать коодридинаты узлов и при нахождении там мыши - создавать Xaml объект.)
С интерактивом в подобных алгоритмах как правило много математики.

Т.е. у вас в оперативной памяти всегда 1 картинка + сколько-то объектов - полилиний.

К слову, через кеширование кроме рисования можно делать довольно производительные анимации, производительный зумминг, производительный скролл…

Есть еще вариант: реализовать рисование на DirectX на C++ и поместить контрол. Более нативно и производительнее.

P/S
свойсвто IsHitTestVisible
https://docs.microsoft.com/ru-ru/dotnet/api/system...
позволяет не реагировать объекту на мышь (т.е. отключает интерактив) это полезно для объектов фона, сильно бустит производительность.
(т.к. по умолчанию WPF определяет все события интерактива на всех объектах, а их может быть бесчисленное множество, и далеко не на всех нужно иметь реакцию на нажатие/OnMouseMove)
Ответ написан
Комментировать
@rPman
Тормозит наверное потому что на on paint перерисовываете все объекты (как минимум при добавлении новой?) Рисуйте линии в битмап однократно и уже его на on paint отрисовывайте.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы