Панелі, про які ви згадуєте, - це панелі "Макет", тому короткий огляд системи компонування говорить про те, що, швидше за все, це буде не просто простий список найефективніших панелей, а те, як ви використовуєте панелі, які мають найбільший вплив на ефективність та ефективність.
LayoutSystem_Overview :
Найпростіше, компонування - це рекурсивна система, яка призводить до розміру, розміщення та малювання елемента. Більш конкретно, макет описує процес вимірювання та упорядкування членів дитячої колекції елемента «Панель». Макет - це інтенсивний процес. Чим більша колекція «Діти», тим більша кількість обчислень, які необхідно зробити. Складність також може бути введена на основі поведінки макета, визначеного елементом Panel, який належить колекції. Порівняно простий панель, такий як Canvas, може мати значно кращі показники роботи, ніж складніші панелі, такі як Grid.
Кожен раз, коли дочірнє UIElement змінює своє положення, воно має потенціал викликати новий пропуск у системі компонування. Тому важливо зрозуміти події, які можуть викликати систему компонування, оскільки непотрібне виклик може призвести до низької продуктивності програми. Далі описується процес, що виникає при виклику системи компонування.
1. Дочірнє UIElement починає процес компонування, спочатку вимірюючи його основні властивості.
2. Оцінюються властивості розмірів, визначені FrameworkElement, такі як ширина, висота та межа.
3. Застосовується специфічна для панелі логіка, наприклад, напрямок доки або орієнтація укладання.
4. Вміст влаштовується після того, як всі діти оцінюються.
5. На екрані малюється дитяча колекція.
6. Процес знову викликається, якщо в колекцію додаються додаткові діти, застосовується LayoutTransform або викликається метод UpdateLayout.
Див. LayoutSystem_Measure_Arrange для отримання додаткової інформації про вимірювання та облаштування дітей
LayoutSystem_Performance :
Макет - це рекурсивний процес. Кожен дочірній елемент колекції для дітей обробляється під час кожного виклику системи компонування. Як результат, слід уникати запуску системи компонування, коли це не потрібно. Наступні міркування можуть допомогти вам досягти кращих показників.
Будьте в курсі, які зміни вартості властивості змусять рекурсивне оновлення системою компонування.
Властивості залежності, значення яких можуть спричинити ініціалізацію системи компонування, позначаються загальнодоступними прапорами. AffectsMeasure та AffectsArrange надають корисні підказки щодо того, які зміни вартості властивості змусять рекурсивне оновлення системою компонування. Загалом, будь-яка властивість, яка може впливати на розмір обмежувального поля елемента, повинна мати прапор AffectsMeasure, встановлений на значення true. Для отримання додаткової інформації див. Огляд властивостей залежності.
Коли це можливо, використовуйте RenderTransform замість LayoutTransform.
Форма LayoutTransform може бути дуже корисним способом впливу на вміст інтерфейсу користувача (UI). Однак, якщо ефект перетворення не повинен впливати на положення інших елементів, найкраще замість цього скористатися RenderTransform, оскільки RenderTransform не викликає систему компонування. LayoutTransform застосовує свою трансформацію і змушує рекурсивне оновлення макета для врахування нового положення ураженого елемента.
Уникайте зайвих дзвінків до UpdateLayout.
Метод UpdateLayout примушує рекурсивне оновлення макета, і це часто не потрібно. Якщо ви впевнені, що потрібне повне оновлення, покладайтеся на систему компонування, щоб викликати цей метод для вас.
Працюючи з великою дитячою колекцією, подумайте про використання VirtualizingStackPanel замість звичайного StackPanel.
Віртуалізуючи дочірню колекцію, VirtualizingStackPanel зберігає лише об'єкти в пам'яті, які зараз перебувають у батьківському ViewPort. Як результат, ефективність роботи значно покращується у більшості сценаріїв.
Оптимізація продуктивності: макет та дизайн : у цій статті детально розказано про те, як ефективно будувати дерево, та наводиться простий перелік панелей на основі їх складності.
Полотно (найменше комплексно = більш ефективна та краща ефективність)
Сітка
Інші панелі (складніші = менш ефективні та гірші показники)
Інші міркування щодо ефективності, на які слід звернути увагу: Шляхи покращення швидкості надання інтерфейсу WPF UI
- Кешуйте все. Кисті, кольори, геометрії, форматовані тексти, гліфи. (Наприклад, у нас є два класи: RenderTools і TextCache. Процес надання кожного блоку звертається до спільного екземпляра обох класів. Отже, якщо дві діаграми мають однаковий текст, його підготовка виконується лише один раз.)
- Freeze Freezable, якщо ви плануєте використовувати його тривалий час. Особливо геометрії. Складні розморожені геометрії виконують HitTest надзвичайно повільно.
- Виберіть найшвидші способи надання кожного примітиву. Наприклад, існує близько 6 способів візуалізації тексту, але найшвидший - DrawingContext.DrawGlyphs.
- Увімкнути переробку контейнера. Віртуалізація приносить багато покращення продуктивності, але контейнери будуть розміщені та створені заново, це за замовчуванням. Але ви можете отримати більшу ефективність, переробивши контейнери, встановивши VirtualizingStackPanel.VirtualizationMode = "Переробка"
- Від сюди : Там немає ніякого практичного обмеження на кількість вкладеності , що ваш додаток може підтримувати, проте, як правило , найкраще обмежити ваше додаток використовувати тільки ті панелі, які дійсно необхідні для потрібного макета. У багатьох випадках елемент Grid можна використовувати замість вкладених панелей завдяки своїй гнучкості в якості контейнера для компонування. Це може підвищити продуктивність у вашій програмі, зберігаючи непотрібні елементи з дерева.