Пути улучшения скорости рендеринга интерфейса пользователя в WPF - PullRequest
41 голосов
/ 23 марта 2011

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

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

Ответы [ 3 ]

50 голосов
/ 23 марта 2011

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

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

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

Несколько советов:

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

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

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

7 голосов
/ 23 марта 2011

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

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

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

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

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

3 голосов
/ 23 марта 2011

Посмотрите на новую (.NET 4.0) опцию кэширования. (См. здесь .)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...