Способы улучшения скорости отображения пользовательского интерфейса WPF

Если экран приложения WPF содержит множество примитивных элементов управления, его рендеринг становится вялым. Каковы рекомендуемые способы повышения чувствительности приложения WPF в таком случае, помимо добавления меньшего количества элементов управления и использования более мощной видеокарты?

Есть ли способ как-то использовать заставку для буферизации или что-то в этом роде?

Ответ 1

Наша команда столкнулась с проблемами рентабельности. В нашем случае у нас около 400 транспортных единиц, и мы должны отображать диаграмму каждого блока с большим количеством деталей (текстовые метки, специальные метки, разные геометрии и т.д.).

В первых наших реализациях мы разделили каждую диаграмму на примитивы и составили целую единицу диаграммы через Binding. Это было очень печальное испытание. Реакция UI была чрезвычайно медленной.

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

Некоторые советы:

  • Загрузите все. Кисти, Цвета, Геометрия, Отформатированные Тексты, Символы. (Например, у нас есть два класса: RenderTools и TextCache. Процесс рендеринга каждого элемента обращается к общему экземпляру обоих классов. Поэтому, если две диаграммы имеют один и тот же текст, его подготовка выполняется только один раз.)
  • Заморозить Freezable, если вы планируете использовать его в течение длительного времени. Особенно геометрия. Сложные незамерзающие геометрии выполняют HitTest чрезвычайно медленно.
  • Выберите самые быстрые способы рендеринга каждого примитива. Например, существует около 6 способов рендеринга текста, но самый быстрый - DrawingContext.DrawGlyphs.
  • Используйте профилировщик для обнаружения горячих точек. Например, в нашем проекте мы использовали кеш геометрии и предоставляли соответствующие им по запросу. Казалось, что никаких улучшений не возможно. Но однажды мы подумали, что, если мы будем визуализировать геометрию один раз и готовые кэш-графики? В нашем случае такой подход оказался приемлемым. Наша диаграмма единиц имеет только несколько состояний. Когда данные диаграммы изменены, мы восстанавливаем DrawingVisual для каждого состояния и помещаем их в кеш.

Конечно, этот путь нуждается в некоторых инвестициях, скучной и скучной работе, но результат потрясающий.

Кстати: когда мы включили опцию кэширования WPF (вы могли найти ссылку в ответах), наше приложение повесило трубку.

Ответ 2

У меня была одна и та же проблема с жестко настроенной datagrid с одного года, и мой вывод:

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

Ссылка, упомянутая Йенсом, велика, но бесполезна в вашем случае.

Ссылка "Оптимизация производительности WPF-приложений", предоставляемая NVM, практически бесполезна в моем опыте: она просто обращается к здравому смыслу, и я уверен, что вы не узнаете ничего экстраординарного ни чтения. За исключением одного, может быть,: я должен сказать, что эта ссылка научила меня вкладывать столько, сколько я могу в свой ресурс приложения. Поскольку WPF не восстанавливает все, что вы вкладываете в ресурс, он просто повторно использует один и тот же ресурс снова и снова. Так что поставьте столько, сколько сможете (стили, кисти, шаблоны, шрифты...)

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

Ответ 3

Посмотрите на новое (.NET 4.0) кеширование. (См. здесь.)