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