Panele, o których wspomniałeś, to panele układu, więc krótki przegląd systemu układu sugeruje, że prawdopodobnie nie będzie to tylko prosta lista najbardziej wydajnych paneli, ale sposób korzystania z paneli, które mają największy wpływ na wydajność i wydajność.
LayoutSystem_Overview :
Mówiąc najprościej, układ jest systemem rekurencyjnym, który prowadzi do wymiarowania, pozycjonowania i rysowania elementu. Dokładniej, układ opisuje proces mierzenia i rozmieszczania członków kolekcji Children elementu panelu. Układ to intensywny proces. Im większa kolekcja Children, tym większa liczba obliczeń, które należy wykonać. Złożoność można również wprowadzić na podstawie zachowania układu zdefiniowanego przez element Panel, który jest właścicielem kolekcji. Stosunkowo prosty panel, taki jak Canvas, może mieć znacznie lepszą wydajność niż bardziej złożony panel, taki jak Grid.
Za każdym razem, gdy element podrzędny UIElement zmienia swoją pozycję, może wyzwolić nowy przebieg przez system układu. Dlatego ważne jest, aby zrozumieć zdarzenia, które mogą wywołać system układu, ponieważ niepotrzebne wywołanie może prowadzić do słabej wydajności aplikacji. Poniżej opisano proces, który występuje po wywołaniu systemu układu.
1. Element podrzędny UIElement rozpoczyna proces tworzenia układu od zmierzenia jego podstawowych właściwości.
2. Oceniane są właściwości rozmiaru zdefiniowane w FrameworkElement, takie jak Width, Height i Margin.
3. Stosowana jest logika specyficzna dla panelu, na przykład kierunek dokowania lub orientacja układania.
4. Treść jest ułożona po zmierzeniu wszystkich dzieci.
5. Na ekranie rysowana jest kolekcja Dzieci.
6. Proces jest wywoływany ponownie, jeśli do kolekcji zostaną dodane dodatkowe elementy podrzędne, zastosowana zostanie metoda LayoutTransform lub zostanie wywołana metoda UpdateLayout.
Zobacz LayoutSystem_Measure_Arrange, aby uzyskać więcej informacji na temat pomiaru i organizowania dzieci
LayoutSystem_Performance :
Układ jest procesem rekurencyjnym. Każdy element podrzędny w kolekcji Children jest przetwarzany podczas każdego wywołania systemu układu. W rezultacie należy unikać uruchamiania układu układu, gdy nie jest to konieczne. Poniższe uwagi mogą pomóc w osiągnięciu lepszej wydajności.
Należy pamiętać, które zmiany wartości właściwości wymuszą aktualizację cykliczną przez system układu.
Właściwości zależności, których wartości mogą spowodować zainicjowanie systemu układu, są oznaczone flagami publicznymi. AffectsMeasure i AffectsArrange zapewniają przydatne wskazówki, które zmiany wartości właściwości wymuszą cykliczną aktualizację przez system układu. Ogólnie rzecz biorąc, każda właściwość, która może wpływać na rozmiar obwiedni elementu, powinna mieć flagę AffectsMeasure ustawioną na true. Aby uzyskać więcej informacji, zobacz Omówienie właściwości zależności.
Jeśli to możliwe, użyj RenderTransform zamiast LayoutTransform.
LayoutTransform może być bardzo użytecznym sposobem wpływania na zawartość interfejsu użytkownika (UI). Jeśli jednak efekt transformacji nie musi wpływać na położenie innych elementów, najlepiej zamiast tego użyć RenderTransform, ponieważ RenderTransform nie wywołuje układu układu. LayoutTransform stosuje swoją transformację i wymusza cykliczną aktualizację układu w celu uwzględnienia nowej pozycji elementu, na który ma to wpływ.
Unikaj niepotrzebnych wywołań UpdateLayout.
Metoda UpdateLayout wymusza cykliczną aktualizację układu i często nie jest konieczna. Jeśli nie masz pewności, że wymagana jest pełna aktualizacja, polegaj na systemie układu, który wywoła tę metodę za Ciebie.
Podczas pracy z dużą kolekcją Children rozważ użycie VirtualizingStackPanel zamiast zwykłego StackPanel.
Wirtualizując kolekcję podrzędną, VirtualizingStackPanel przechowuje tylko obiekty w pamięci, które są obecnie w ViewPort elementu nadrzędnego. W rezultacie w większości scenariuszy wydajność znacznie się poprawiła.
Optymalizacja wydajności: układ i projekt : ten artykuł zawiera szczegółowe informacje na temat wydajnego tworzenia drzewa i podaje prostą listę paneli na podstawie ich złożoności
Płótno (najmniej złożone = bardziej wydajne i lepsze działanie)
Krata
Inne panele (bardziej złożone = mniej wydajne i gorsza wydajność)
Inne kwestie dotyczące wydajności, na które należy zwrócić uwagę: Sposoby poprawy szybkości renderowania interfejsu użytkownika WPF
- Buforuj wszystko. Pędzle, kolory, geometrie, sformatowane teksty, glify. (Na przykład mamy dwie klasy: RenderTools i TextCache. Proces renderowania adresów każdej jednostki do współdzielonej instancji obu klas. Jeśli więc dwa wykresy mają ten sam tekst, jego przygotowanie jest wykonywane tylko raz.)
- Freeze Freezable, jeśli planujesz używać go przez długi czas. Zwłaszcza geometrie. Złożone, niezamrożone geometrie wykonują HitTest bardzo wolno.
- Wybierz najszybsze sposoby renderowania każdego prymitywu. Na przykład istnieje około 6 sposobów renderowania tekstu, ale najszybszy jest DrawingContext.DrawGlyphs.
- Włącz recykling kontenerów. Wirtualizacja przynosi wiele ulepszeń wydajności, ale kontenery zostaną usunięte i ponownie utworzone, jest to ustawienie domyślne. Możesz jednak uzyskać większą wydajność, poddając recyklingowi kontenery, ustawiając VirtualizingStackPanel.VirtualizationMode = "Recykling"
- Od tutaj : Nie ma praktycznego ograniczenia co do ilości gniazdowania, że aplikacja może obsługiwać, jednak na ogół najlepiej ograniczyć swoją aplikację do korzystania tylko te panele, które są rzeczywiście niezbędne do żądanego układu. W wielu przypadkach element Grid może być używany zamiast paneli zagnieżdżonych ze względu na jego elastyczność jako kontener układu. Może to zwiększyć wydajność aplikacji, usuwając niepotrzebne elementy z drzewa.