Porównaj ceny domen i usług IT, sprzedawców z całego świata

Sposoby poprawy szybkości renderowania interfejsu użytkownika WPF


Jeśli ekran aplikacji WPF zawiera wiele formantów prymitywnych, jego renderowanie staje się powolne. Jakie są zalecane sposoby poprawy wydajności aplikacji WPF w tym przypadku, poza dodaniem mniejszej liczby kontrolek i użyciem mocniejszej karty graficznej?
Czy jest sposób, aby jakoś użyć buforowania poza ekranem?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Nasz zespół napotkał problemy z wydajnością renderowania. W naszym przypadku mamy około 400 jednostek transportowych i musimy wyrenderować schemat każdej jednostki z dużą ilością szczegółów (etykiety tekstowe, etykiety specjalne, różne geometrie itp.).
W naszych pierwszych implementacjach podzieliliśmy każdy diagram na prymitywy i sporządziliśmy wykres całego bloku za pomocą kotwicy. To było bardzo smutne doświadczenie. Odpowiedź interfejsu użytkownika była bardzo powolna.
Dlatego zdecydowaliśmy się stworzyć oprogramowanie

jeden

UI element na jednostkę i renderuj diagram przy użyciu DrawingContext. Chociaż było to znacznie lepsze pod względem wydajności, spędziliśmy około miesiąca na ulepszaniu renderowania.
Kilka wskazówek:
  • Buforuj wszystko. Pędzle, kolory, geometria, sformatowane teksty, glify. (Na przykład mamy dwie klasy:
    RenderTools
    i
    TextCache
    . Proces renderowania każdego bloku odnosi się do wspólnej instancji obu klas. Zatem jeśli dwie grafiki mają takie same tekst, jest przygotowywany tylko raz.)
  • Zablokuj
    Freezable
    , jeśli planujesz używać go przez długi czas. Szczególnie geometria. Złożone, niezamrożone geometrie są niezwykle powolne do wykonania przez HitTest.
  • Wybierz najszybszy sposób renderowania każdego prymitywu. Na przykład istnieje około 6 sposobów renderowania tekstu, ale najszybszy to
    DrawingContext.DrawGlyphs
    .
  • Użyj programu profilującego, aby wykryć punkty aktywne. Na przykład w naszym projekcie mieliśmy pamięć podręczną geometrii i wykonaliśmy odpowiednie na żądanie. Wydawałoby się, że nie ma poprawy. Ale pewnego dnia pomyśleliśmy: co by było, gdybyśmy raz wyrenderowali geometrię i buforowali renderowane efekty wizualne W naszym przypadku takie podejście okazało się akceptowalne. Na mapie naszej jednostki jest tylko kilka stanów. Gdy dane wykresu ulegną zmianie, odbudowujemy DrawingVisual dla każdego stanu i umieszczamy go w pamięci podręcznej.

Oczywiście ta ścieżka wymaga pewnych inwestycji, jest nudną i nudną pracą, ale efekt jest niesamowity.
Przy okazji: kiedy włączyliśmy opcję buforowania WPF (link można znaleźć w odpowiedziach), nasza aplikacja zawiesiła się.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Miałem ten sam problem z perfekcją z wysoce skonfigurowanym datagridem sprzed jednego roku, a mój wynik jest taki:

w zasadzie nic nie możesz zrobić
ze swojej strony (bez wpływu na twój
aplikacja, czyli posiadająca mniej kontrolek, lub
używając tylko domyślnych stylów)

Link wspomniany przez Jensa jest świetny, ale nie pomocny w twoim przypadku.
Łącze „Optymalizacja wydajności aplikacji WPF” udostępniane przez NVM jest prawie tak samo bezużyteczne z mojego doświadczenia: po prostu przemawia do zdrowego rozsądku i jestem pewien, że nie nauczysz się niczego nadzwyczajnego, czytając też.

Może z wyjątkiem jednego

be: Muszę powiedzieć, że ten link nauczył mnie inwestowania jak najwięcej w zasoby mojej aplikacji. Ponieważ WPF nie odzyskuje niczego, co zainwestowałeś w zasób, po prostu ponownie używa tego samego zasobu w kółko. Więc umieść tam tyle (style, pędzle, szablony, czcionki ...)
ogólnie rzecz biorąc, w WPF po prostu nie ma sposobu, aby przyspieszyć działanie, po prostu zaznaczając jedną opcję lub wyłączając drugą. Możesz po prostu poprosić MS, aby w najbliższej przyszłości przerobił twoją warstwę renderowania, aby ją zoptymalizować, a w międzyczasie spróbuj zmniejszyć zapotrzebowanie na efekty, niestandardowe elementy sterujące i tak dalej ...
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Przyjrzyj się nowej opcji buforowania (.NET 4.0). (Cm.

tutaj
http://msdn.microsoft.com/libr ... .aspx
.)

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się