Często zdarza się, że więcej niż jeden panel pasuje do układu, który chcę, jednak wiem, że istnieje różnica w czasie renderowania dla różnych typów paneli.
Na przykład MSDN stwierdza, że
Stosunkowo prosty
Panel
, taki jakCanvas
, może mieć znacznie lepszą wydajność niż bardziej złożonyPanel
, taki jakGrid
.
Więc pod względem czasu renderowania i wydajności, w jakiej kolejności panele WPF są najbardziej wydajne?
Panele WPF:
Canvas
DockPanel
Grid
UniformGrid
StackPanel
WrapPanel
VirtualizingPanel
/VirtualizingStackPanel
Jestem prawie pewien, że widziałem listę tego gdzieś w Internecie, ale nie mogę jej teraz znaleźć.
Idealna odpowiedź, której szukam, to lista paneli w kolejności, w której renderowałyby się najszybciej. Rozumiem, że liczba dzieci ma duży wpływ na skuteczność paneli, więc na potrzeby tego pytania załóżmy, że każdy panel ma tylko parę Label
/ TextBox
.
Ponadto chciałbym uzyskać listę wyjątków, takich jak określone panele, które działają lepiej niż inne w oparciu o określone warunki.
Aktualizacja
Podsumowując na podstawie zaakceptowanej odpowiedzi poniżej, wydajność panelu jest oparta na liczbie i układzie elementów podrzędnych, jednak generalnie lista od najszybszych do najwolniejszych jest następująca:
Canvas
StackPanel
WrapPanel
DockPanel
Grid
Ponadto znak VirtualizingPanel
/ VirtualizingStackPanel
powinien być zawsze używany, jeśli istnieje wiele elementów, które nie zawsze mieszczą się na ekranie.
Gorąco polecam przeczytanie zaakceptowanej odpowiedzi poniżej, aby uzyskać więcej informacji, zanim wybierzesz przedmiot z tej listy.
źródło
VirtualizingStackPanel
zdecydowanie lepiej się sprawdzi, ale jeśli wszystkie elementy wyświetlane w panelu są widoczne niż myślę, lepiej użyć zwykłego panelu.Odpowiedzi:
Myślę, że opisanie charakterystyk wydajności każdego panelu jest bardziej zwięzłe i zrozumiałe niż próba uzyskania bezwzględnego względnego porównania wydajności.
WPF wykonuje dwa przebiegi podczas renderowania zawartości: Zmierz i Rozmieść. Każdy panel ma inną charakterystykę działania dla każdego z tych dwóch przejść.
Na wydajność przebiegu pomiaru największy wpływ ma zdolność panelu do dostosowania się do rozciągania za pomocą wyrównania (lub Auto w przypadku
Grid
), a następnie liczba elementów podrzędnych, które są rozciągane lub automatycznie dopasowują się do rozmiaru. Na wykonanie przebiegu Arrange ma wpływ złożoność interakcji między rozmieszczeniem różnych elementów potomnych, a następnie oczywiście liczbą elementów podrzędnych.Czasami dane panele nie dają się łatwo dopasować do wymaganego układu. Utworzyłem kontrolkę, która wymagała dowolnej liczby elementów, aby każdy z nich był umieszczony w określonym procencie dostępnej przestrzeni. Żadna z domyślnych kontrolek tego nie robi. Próba zmuszenia ich do tego (poprzez powiązanie z rzeczywistym rozmiarem rodzica) skutkuje okropnymi wynikami. Stworzyłem panel układu w oparciu o Canvas, który przy minimalnym nakładzie pracy osiągnął pożądany efekt (skopiowałem źródło płótna i zmodyfikowałem około 20 linii).
Dostępne panele:
Brezentowy
Płótno ma najlepszą wydajność wszystkich paneli dla przejścia aranżacji, ponieważ każdemu elementowi jest statycznie przypisana lokalizacja. Przejście pomiarowe ma również doskonałą wydajność, ponieważ w tym panelu nie ma koncepcji rozciągania; każde dziecko po prostu używa swojego natywnego rozmiaru.
DockPanel
Dockpanel ma bardzo prosty schemat układu, w którym elementy są dodawane jeden po drugim względem poprzedniego dodanego elementu. Domyślnie wysokość lub szerokość jest określana przez rodzimy rozmiar elementu (odpowiednio na podstawie góry / dołu i lewej / prawej strony), a inny kierunek jest określany przez
Dock
właściwość, jeśli szerokość lub wysokość są niezdefiniowane. Średni do szybkiego podania miary i średni do szybkiego przejścia aranżacyjnego.Krata
Może to być panel wymagający największej wydajności, jeśli używane jest skalowanie proporcjonalne lub automatyczne. Obliczanie rozmiaru elementu podrzędnego może być złożoną kombinacją natywnego rozmiaru elementu i układu określonego w siatce. Układ jest również najbardziej skomplikowany ze wszystkich paneli. Niska do średniej wydajności w przypadku przebiegu taktu i powolna do średniej wydajności w trakcie aranżacji.
StackPanel
StackPanel mierzy swoje elementy podrzędne przy użyciu rozmiaru natywnego lub względnego w kierunku przeciwnym do jego orientacji i rozmiaru natywnego w kierunku jego orientacji (wyrównanie nie robi nic w tym kierunku). To czyni go wykonawcą średniego poziomu w tej dziedzinie. Przepustka aranżacyjna to po prostu układanie elementów w kolejności. Prawdopodobnie drugi najlepszy wynik dla tej przepustki. Średnia wydajność dla przebiegu pomiaru i wysoka wydajność dla przebiegu układu.
VirtualizingPanel
Klasa bazowa do implementacji własnego panelu wirtualizacyjnego. Ładuje tylko widoczne elementy, aby zapobiec niepotrzebnemu użyciu pamięci i procesora. DUŻO bardziej wydajne dla zestawów przedmiotów. Prawdopodobnie nieco mniej wydajne w przypadku przedmiotów, które mieszczą się na ekranie ze względu na sprawdzanie granic. Zestaw SDK udostępnia tylko jedną podklasę tego programu
VirtualizingStackPanel
.WrapPanel
Przebieg miary jest dość złożonym przebiegiem, w którym największy element w danym wierszu określa wysokość wiersza, a następnie każdy element w tym wierszu używa swojej natywnej wysokości (jeśli ma) lub wysokości wiersza. Przebieg układu jest prosty: umieszcza każdy element jeden po drugim w rzędzie, a następnie przechodzi do następnego rzędu, gdy nie ma wystarczającej ilości miejsca na następny element. Wynik pomiaru średniej wydajności. Średni do szybkiego wykonania dla przejścia aranżacyjnego.
Bibliografia:
Od optymalizacji wydajności: układ i projekt
Od mierzenia i organizowania dzieci
źródło
UniformGrid
nigdzie na twojej liście. Czy byłbyś w stanie zaktualizować swoją odpowiedź za pomocą tego panelu i jego szacunkowej wydajności pomiaru / aranżacji w odniesieniu do innych typów paneli?UniformGrid
nie jest przeznaczony do wykorzystania w układzie aplikacji. Aby uzyskać więcej informacji, zobacz „Pochodne elementy panelu” tutaj: msdn.microsoft.com/en-us/library/ms754152.aspx . Pod względem szybkości powinien być nieco szybszy niż aDockPanel
i nieco wolniejszy niż aCanvas
.Może to ci pomoże.
Nie tylko do paneli, ale także do każdej aplikacji, którą chcesz wykonać w WPF.
Kończy rysowanie i pomiary wydajności WPF.
Zawiera również aplikację do testowania rysunków, wyniki i wnioski dla różnych systemów operacyjnych, na które chcesz kierować.
źródło
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
źródło