Упомянутые вами панели являются панелями макетов, поэтому краткий обзор системы макетов показывает, что, скорее всего, это будет не просто список наиболее эффективных панелей, а то, как вы используете панели, которые оказывают наибольшее влияние на эффективность и производительность. .
LayoutSystem_Overview :
В самом простом виде компоновка представляет собой рекурсивную систему, которая приводит к тому, что элемент измеряется, позиционируется и рисуется. Более конкретно, макет описывает процесс измерения и упорядочения элементов коллекции Children элемента Panel. Макет - это интенсивный процесс. Чем больше коллекция Children, тем больше должно быть выполнено вычислений. Сложность также может быть введена на основе поведения макета, определенного элементом Panel, который владеет коллекцией. Относительно простая панель, такая как Canvas, может иметь значительно лучшую производительность, чем более сложная панель, такая как Grid.
Каждый раз, когда дочерний элемент UIElement меняет свою позицию, он может инициировать новый проход с помощью системы макетов. Следовательно, важно понимать события, которые могут вызывать систему макетов, поскольку ненужный вызов может привести к снижению производительности приложения. Далее описывается процесс, который происходит при вызове системы макетов.
1.
Дочерний UIElement начинает процесс компоновки, сначала измеряя его основные свойства.
2.
Оцениваются свойства размеров, определенные в FrameworkElement, такие как Width, Height и Margin.
3.
Применяется специфичная для панели логика, например, направление дока или ориентация стека.
4.
Содержание организовано после того, как все дети были измерены.
5.
Детская коллекция нарисована на экране.
6.
Процесс вызывается снова, если в коллекцию добавляются дополнительные дочерние элементы, применяется LayoutTransform или вызывается метод UpdateLayout.
См. LayoutSystem_Measure_Arrange для получения дополнительной информации об измерении и расположении детей
LayoutSystem_Performance :
Макет - это рекурсивный процесс. Каждый дочерний элемент в коллекции Children обрабатывается во время каждого вызова системы макета. В результате следует избегать запуска системы макетов, когда в этом нет необходимости. Следующие соображения могут помочь вам повысить производительность.
Помните, какие изменения значений свойств приведут к рекурсивному обновлению системой макетов.
Свойства зависимостей, значения которых могут привести к инициализации системы макетов, помечаются общедоступными флагами. AffectsMeasure и AffectsArrange предоставляют полезные подсказки относительно того, какие изменения значений свойств приведут к рекурсивному обновлению системой макетов. В общем, любое свойство, которое может влиять на размер ограничивающего прямоугольника элемента, должно иметь для флага AffectsMeasure значение true. Для получения дополнительной информации см. Обзор свойств зависимости.
Когда это возможно, используйте RenderTransform вместо LayoutTransform.
LayoutTransform может быть очень полезным способом повлиять на содержимое пользовательского интерфейса (UI). Однако, если эффект преобразования не должен влиять на положение других элементов, лучше вместо этого использовать RenderTransform, потому что RenderTransform не вызывает систему макетов. LayoutTransform применяет свое преобразование и вынуждает рекурсивное обновление макета учитывать новую позицию затронутого элемента.
Избегайте ненужных звонков на UpdateLayout.
Метод UpdateLayout вызывает рекурсивное обновление макета и часто не требуется. Если вы не уверены, что требуется полное обновление, положитесь на систему макетов, чтобы вызвать этот метод для вас.
При работе с большой коллекцией Children рассмотрите возможность использования VirtualizingStackPanel вместо обычной StackPanel.
Путем виртуализации дочерней коллекции VirtualizingStackPanel сохраняет в памяти только те объекты, которые в данный момент находятся в родительском ViewPort.В результате производительность значительно улучшается в большинстве сценариев.
Оптимизация производительности: макет и дизайн : в этой статье подробно рассказывается о том, как эффективно построить дерево, и приводится простой список панелей.в зависимости от их сложности
Холст (наименьший полнота = более эффективная и лучшая производительность)
Сетка
Другие панели (более сложные = менее эффективная и худшая производительность)
Другие соображения производительности, на которые следует обратить внимание: Способы повышения скорости рендеринга пользовательского интерфейса WPF
- Кэшируйте все.Кисти, цвета, геометрия, форматированные тексты, глифы.(Например, у нас есть два класса: RenderTools и TextCache. Процесс рендеринга каждого модуля обращается к общему экземпляру обоих классов. Поэтому, если у двух диаграмм одинаковый текст, его подготовка выполняется только один раз.)
- Freeze Freezable, если вы планируете использовать его в течение длительного времени.Особенно геометрии.Сложные незамерзающие геометрии выполняют HitTest крайне медленно.
- Выберите самые быстрые способы рендеринга каждого примитива.Например, существует около 6 способов визуализации текста, но самым быстрым является DrawingContext.DrawGlyphs.
- Включить утилизацию контейнера.Виртуализация приносит много улучшений производительности, но контейнеры будут удалены и созданы заново, это значение по умолчанию.Но вы можете повысить производительность, перерабатывая контейнеры, установив VirtualizingStackPanel.VirtualizationMode = "Recycling"
- С здесь : практического ограничения на количество вложений, которое может поддерживать ваше приложение, не существует, однакоКак правило, лучше ограничить ваше приложение только теми панелями, которые действительно необходимы для вашего желаемого макета.Во многих случаях элемент Grid может использоваться вместо вложенных панелей благодаря своей гибкости в качестве контейнера макета.Это может повысить производительность вашего приложения, убрав ненужные элементы из дерева.