Часто бывает, что для нужного мне макета подходит более одной панели, однако я знаю, что время рендеринга для разных типов панелей различается.
Например, MSDN утверждает, что
Относительно простой
Panel
, напримерCanvas
, может иметь значительно лучшую производительность, чем более сложныйPanel
, напримерGrid
.
Итак, с точки зрения времени рендеринга и производительности, в каком порядке панели WPF наиболее эффективны?
Панели WPF:
Canvas
DockPanel
Grid
UniformGrid
StackPanel
WrapPanel
VirtualizingPanel
/VirtualizingStackPanel
Я почти уверен, что видел их список где-то в Интернете, но сейчас не могу его найти.
Идеальный ответ, который я ищу, предоставит мне список панелей в том порядке, в котором они будут отображаться быстрее всего. Я понимаю, что количество детей является важным фактором, влияющим на эффективность панелей, поэтому для ответа на этот вопрос предположим, что каждая панель имеет только пару Label
/ TextBox
.
Кроме того, мне нужен список исключений, таких как определенные панели, которые работают лучше других в зависимости от определенных условий.
Обновить
Подводя итог на основе принятого ниже ответа , производительность панели зависит от количества и расположения дочерних элементов, однако в целом список от самого быстрого к самому медленному:
Canvas
StackPanel
WrapPanel
DockPanel
Grid
Кроме того, VirtualizingPanel
/ VirtualizingStackPanel
всегда следует использовать , если есть много вещей , которые не всегда помещаются на экране.
Я настоятельно рекомендую вам прочитать принятый ответ ниже, чтобы получить более подробную информацию, прежде чем просто выбирать элемент из этого списка.
источник
VirtualizingStackPanel
определенно будет работать лучше, но если все элементы, отображаемые на панели, видны, я думаю, лучше использовать обычную панель.Ответы:
Я думаю, что описать рабочие характеристики каждой панели проще и понятнее, чем пытаться дать абсолютное относительное сравнение производительности.
WPF выполняет два прохода при рендеринге содержимого: измерение и упорядочение. Каждая панель имеет разные характеристики производительности для каждого из этих двух проходов.
На производительность прохода измерения больше всего влияет способность панели приспосабливать растяжение с помощью выравнивания (или Авто в случае
Grid
), а затем количество дочерних элементов, которые растягиваются или автоматически изменяются. На производительность этапа Arrange влияет сложность взаимодействия между расположением макета различных дочерних элементов и, конечно же, количеством дочерних элементов.Порой данные панели не легко поддаются нужной компоновке. Я создал элемент управления, которому требовалось произвольное количество элементов, каждый из которых должен располагаться на определенном проценте доступного пространства. Ни один из элементов управления по умолчанию этого не делает. Попытка заставить их сделать это (через привязку к фактическому размеру родителя) приводит к ужасной производительности. Я создал панель макета на основе Canvas, которая достигла желаемого результата с минимальными усилиями (я скопировал исходный код для холста и изменил его около 20 строк).
Доступные панели:
холст
Canvas имеет лучшую производительность среди всех панелей для прохода аранжировки, поскольку каждому элементу статически назначено местоположение. Проход измерения также имеет отличную производительность, поскольку в этой панели нет концепции растяжения; каждый ребенок просто использует свой собственный размер.
DockPanel
Dockpanel имеет очень простую схему компоновки, в которой элементы добавляются один за другим относительно предыдущего добавленного элемента. По умолчанию высота или ширина определяется собственным размером элемента (на основе верхнего / нижнего и левого / правого соответственно), а другое направление определяется
Dock
свойством, если ширина или высота не определены. От среднего до быстрого прохода измерения и от среднего до быстрого прохода аранжировки.сетка
Это может быть панель с наиболее высокой производительностью, если используется пропорциональная калибровка или автоматическая калибровка. Расчет размера дочернего элемента может быть сложным сочетанием собственного размера элемента и макета, указанного в сетке. Планировка тоже самая сложная из всех панелей. От низкой до средней производительности для такта и от медленной до средней для аранжировки.
StackPanel
StackPanel измеряет своих дочерних элементов, используя собственный или относительный размер в направлении, противоположном его ориентации, и собственный размер в направлении его ориентации (выравнивание ничего не делает в этом направлении). Это делает его исполнителем среднего уровня в этой области. Пропуск Arrangement - это просто размещение элементов по порядку. Наверное, второй лучший результат в этом пасе. Средняя производительность для прохода измерения и высокая производительность для прохода макета.
VirtualizingPanel
Базовый класс для реализации вашей собственной панели виртуализации. Загружает только видимые элементы, чтобы предотвратить ненужное использование памяти и процессора. НАМНОГО более производительный для наборов предметов. Вероятно, немного менее эффективен для элементов, которые помещаются на экране, из-за проверки границ. SDK предоставляет только один подкласс этого -
VirtualizingStackPanel
.WrapPanel
Этап измерения - это несколько сложный этап, на котором самый большой элемент для конкретной строки определяет высоту строки, а затем каждый элемент в этой строке либо использует свою собственную высоту (если она есть), либо высоту строки. Этап макета прост: каждый элемент помещается один за другим в строку, а затем продолжается переход к следующей строке, когда для следующего элемента недостаточно места. Пройден средний результат. От среднего до быстрого исполнения для аранжировки.
Ссылки:
От Оптимизация производительности: верстка и дизайн
От измерения и расположения детей
источник
UniformGrid
в вашем списке. Сможете ли вы обновить свой ответ с помощью этой панели и ее оценки эффективности измерения / упорядочения по сравнению с другими типами панелей?UniformGrid
не предназначен для использования в макете приложения. См. «Производные элементы панели» здесь: msdn.microsoft.com/en-us/library/ms754152.aspx для получения дополнительной информации. По скорости он должен быть немного быстрее, чем a,DockPanel
и немного медленнее, чем aCanvas
.Может это тебе поможет.
Не только для панелей, но и для каждого приложения, которое вы хотите создать в WPF.
Он завершает отрисовку и измерение производительности WPF.
В нем также есть приложение для рисования, результаты и выводы для различных операционных систем, на которые вы хотите ориентироваться.
источник
Упомянутые вами панели являются панелями макета, поэтому краткий обзор системы макета предполагает, что это, вероятно, будет не просто список наиболее эффективных панелей, а то, как вы используете панели, которые имеют наибольшее влияние на эффективность и производительность.
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
источник