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