Narzędzie Profile GPU Rendering wskazuje względny czas, jaki upłynął w każdym etapie używane przez potok renderowania do wyrenderowania poprzedniej klatki. Ta wiedza może pomóc w wykryciu wąskich gardeł w procesie sprzedaży, Wiesz, co zoptymalizować, by zwiększyć wydajność renderowania aplikacji.
Na tej stronie pokrótce wyjaśniono, co dzieje się na każdym etapie potoku. omawiają tu problemy, które mogą powodować wąskie gardła. Przed przeczytaniem tej strony, prawdopodobnie znasz już informacje GPU profilu Aby zrozumieć, jak wszystkie etapy łączą się ze sobą, pomocne może być przejrzenie jak działa potok renderowania.
Prezentacja wizualna
Narzędzie Profile GPU Rendering wyświetla etapy i ich względne czasy w polu wykres: kolorowy histogram. Rysunek 1 pokazuje przykład takiego wyświetlacza.
![](https://developer.android.google.cn/static/topic/performance/images/bars.png?authuser=8&hl=pl)
Rysunek 1. Profil renderowania GPU
Każdy segment każdego pionowego słupka wyświetlany w sekcji Profile GPU Rendering. przedstawia etap procesu i jest wyróżniony kolor wykres słupkowy. Rysunek 2 przedstawia znaczenie każdego wyświetlanego koloru.
![](https://developer.android.google.cn/static/topic/performance/images/s-profiler-legend.png?authuser=8&hl=pl)
Rysunek 2. Legenda wykresu renderowania GPU profilu
Gdy zrozumiesz, co oznaczają poszczególne kolory, możesz kierować reklamy na konkretne aspekty , by zoptymalizować jej wydajność.
Etapy i ich znaczenie
W tej sekcji wyjaśniamy, co dzieje się na każdym z etapów odpowiadające do koloru przedstawionego na ilustracji 2. oraz wąskie gardła, na które trzeba zwrócić uwagę.
Obsługa danych wejściowych
Etap obsługi danych wejściowych potoku mierzy, jak długo aplikacja na obsługę zdarzeń wejściowych. Te dane pokazują, jak długo aplikacja wydanego na wykonanie kodu wywoływanego w wyniku wywołań zwrotnych zdarzeń wejściowych.
Gdy segment jest duży
Wysokie wartości w tym obszarze są zwykle wynikiem zbyt wielu działań lub zbyt złożona praca, która występuje w wywołaniach zwrotnych zdarzeń modułu obsługi danych wejściowych. Te wywołania zwrotne zawsze występują w wątku głównym, dlatego rozwiązania tego problemu skupienie się na bezpośredniej optymalizacji pracy lub odciążeniu jej w innym wątku.
Warto również zauważyć,
RecyclerView
może na tym etapie wyświetlić się przewijanie.
RecyclerView
przewija się od razu po zarejestrowaniu zdarzenia dotknięcia. W rezultacie
może zwiększać lub wypełniać nowe wyświetlenia elementów. Z tego powodu ważne jest,
aby ta operacja była jak najprostsza. narzędzi do profilowania, takich jak Traceview lub
Firma Systrace może pomóc w dalszej analizie tej sprawy.
Animacja
Etap Animacje pokazuje, ile czasu zajęło Ci określenie wszystkich
z animatorów w tym kadrze. Najpopularniejsi animatorzy
ObjectAnimator
,
ViewPropertyAnimator
i
Przejścia
Gdy segment jest duży
Wysokie wartości w tym obszarze są zwykle wynikiem prac wykonywanych
do pewnej zmiany właściwości animacji. Na przykład animacja przelotu,
które przewija element ListView
lub
RecyclerView
,
powoduje inflację i populację widzów.
Pomiar/układ
Aby Android mógł narysować elementy widoku na ekranie, program uruchamia dwie konkretne operacje w układach i widokach w hierarchii widoków.
Najpierw system mierzy wyświetlenia. Każdy widok i układ określone dane opisujące rozmiar obiektu na ekranie. Niektóre wyświetlenia może mieć określony rozmiar; inne mają rozmiar, który dostosowuje się do rozmiaru kontenera układu nadrzędnego
Następnie system rozkłada elementy widoku. Gdy system obliczy, rozmiarów widoków podrzędnych, system może dobierać układ, dostosowywać rozmiar i odpowiednim pozycjonowaniem widoków na ekranie.
System wykonuje pomiary i układy nie tylko po to, by stworzyć widok, ale także dla nadrzędnych hierarchii tych widoków, aż do poziomu głównego widok.
Gdy segment jest duży
Jeśli aplikacja spędza dużo czasu na klatce w tym obszarze, zwykle z powodu ogromnej liczby wyświetleń, które muszą lub problemy takie jak o podwójnym opodatkowaniu znajdziesz w niewłaściwym miejscu w hierarchii. W każdym z tych przypadków odpowiadanie na skuteczność ulepszanie wydajność hierarchii widoków.
Kod dodany do strony
onLayout(boolean, int, int, int, int)
lub
onMeasure(int, int)
mogą również wpływać na wydajność
problemów. Traceview i
Systrace pomoże Ci zbadać
stosów wywołań do zidentyfikowania
problemów w kodzie.
Rysowanie
Na etapie rysowania wykonywane są operacje renderowania widoku, na przykład rysowanie. tekstu tła lub rysunku, w sekwencję natywnych poleceń rysowania. System rejestruje te polecenia na liście wyświetlania.
Pasek rysowania rejestruje czas potrzebny do wykonania polecenia
na listę wyświetlania dla wszystkich widoków, które trzeba zaktualizować na ekranie.
w tej ramce. Zmierzony czas dotyczy każdego kodu dodanego do interfejsu
obiekty w aplikacji. Przykładami tego kodu mogą być
onDraw()
,
dispatchDraw()
,
i różne draw ()methods
należące do podklas
Drawable
zajęcia.
Gdy segment jest duży
W przypadku uproszczenia te dane pokazują, ile czasu potrzebowali
aby realizować wszystkie wywołania
onDraw()
za każdy unieważniony widok. Ten
pomiar obejmuje czas wysyłania dzieciom poleceń rysowania
obiekty rysowane, które mogą być dostępne. Z tego powodu, kiedy zauważysz gwałtowny wzrost słupka,
może doprowadzić do tego, że grupa wyświetleń nagle stanie się unieważniona. Unieważnienie
co sprawia, że trzeba ponownie wygenerować widoki” list displayowych. Ewentualnie
może być efektem kilku widoków niestandardowych, które mają wyjątkowo
złożonej logiki w sposób,
onDraw()
metody.
Zsynchronizuj/prześlij
Funkcje synchronizacji Wskaźnik przesyłania reprezentuje czas potrzebny na przeniesienie obiekty mapy bitowej z pamięci CPU do pamięci GPU w bieżącej ramce.
Procesor i GPU mają różne obszary pamięci RAM, ponieważ są to różne procesory na przetwarzanie. Podczas rysowania bitmapy na Androidzie system przesyła bitmapę do pamięci GPU, zanim GPU wyrenderuje ją w ekranu. Następnie GPU zapisuje mapę bitową w pamięci podręcznej, dzięki czemu system nie musi tego robić prześlij dane ponownie, chyba że tekstura zostanie usunięta z tekstu GPU pamięci podręcznej.
Uwaga: na urządzeniach z systemem Lollipop ten etap to fioletowy.
Gdy segment jest duży
Wszystkie zasoby ramki, zanim będą mogły się znajdować, muszą znajdować się w pamięci GPU służy do rysowania ramki. Oznacza to, że wysoka wartość tego wskaźnika może oznaczać, albo duża liczba niewielkich wczytywanych zasobów albo niewielka liczba bardzo dużych i zasobami Google Cloud. Częstym przypadkiem jest wyświetlanie w aplikacji pojedynczej mapy bitowej, mniej więcej do rozmiaru ekranu. Inny przypadek to sytuacja, w której aplikacja wyświetla dużą liczbę miniatur.
Aby zmniejszyć ten słupek, możesz zastosować takie techniki:
- Upewnij się, że rozdzielczość bitmapy nie jest znacznie większa niż . Aplikacja nie powinna na przykład wyświetlać obrazu w rozdzielczości 1024 x 1024, jako obraz 48 x 48.
-
Korzystasz z:
prepareToDraw()
asynchronicznie przed rozpoczęciem kolejnego etapu synchronizacji.
Wydaj polecenia
Segment Polecenia wydawnicze pokazuje czas potrzebny do wydania wszystkich z poleceń niezbędnych do rysowania list wyświetlania na ekranie.
Aby system rysował listy wyświetlane na ekranie, wysyła parametr niezbędne polecenia do GPU. Zwykle wykonuje to działanie za pomocą polecenia Interfejs API OpenGL ES.
Ten proces może trochę potrwać, ponieważ system przeprowadza ostateczną przekształcenie i przycinanie dla każdego polecenia przed wysłaniem go do GPU. Dodatkowe informacje i w ten sposób zwiększa się narzut po stronie GPU, która oblicza ostatnie polecenia. Te obejmują końcowe przekształcenia i dodatkowe przycięcia.
Gdy segment jest duży
Czas, jaki upłynął na tym etapie, jest bezpośrednim miernikiem złożoności i liczba list wyświetlania, które system renderuje w danej ramki. Na przykład wykonywanie wielu operacji rysowania, zwłaszcza w przypadku, gdy istnieje mały nieodłączny koszt dla każdego prostego obiektu rysunkowego, więc tym razem może on zostać zawyżony. Na przykład:
Kotlin
for (i in 0 until 1000) { canvas.drawPoint() }
Java
for (int i = 0; i < 1000; i++) { canvas.drawPoint() }
jest znacznie droższe niż:
Kotlin
canvas.drawPoints(thousandPointArray)
Java
canvas.drawPoints(thousandPointArray);
Nie zawsze istnieje 1:1 korelacja między wydawaniem poleceń a listy wyświetlane. W przeciwieństwie do polecenia wydającego polecenia który rejestruje czas potrzebny na wysłanie poleceń rysowania do GPU, dane Draw oznaczają czas potrzebny na przechwycenie wysłanego na liście wyświetlania.
Ta różnica wynika z tego, że listy displayowe są przechowywane w pamięci podręcznej gdy tylko jest to możliwe. W efekcie zdarzają się sytuacje, w których przewijanie, przekształcanie lub animacja wymaga, aby system ponownie wysłał wyświetlacz. bez konieczności jej ponownego tworzenia. od podstaw. W rezultacie możesz zobaczyć duży komunikat „Problem”, polecenia” bez wysokiego paska Polecenia rysowania.
Procesy/bufory zamiany
Gdy Android zakończy przesyłanie do GPU, system wysyła ostatnie polecenie, które informuje sterownik karty graficznej, z bieżącą klatką. Na tym etapie kierowca może w końcu przedstawić zaktualizowany obraz na ekranie.
Gdy segment jest duży
Warto pamiętać, że układ GPU działa równolegle z CPU. W systemie Android występują problemy z rysowaniem poleceń do GPU, a następnie w następnym zadaniu. GPU odczytuje te polecenia rysowania z kolejki i rozpoczyna procesy .
W sytuacjach, gdy procesor wysyła polecenia szybciej niż GPU podczas ich przyswajania, kolejka komunikacji między procesorami może stać się pełny. W takim przypadku procesor blokuje się i czeka, aż w w kolejce do umieszczenia następnego polecenia. Stan pełnej kolejki występuje często Zamień bufory, bo wtedy cała klatka jest warta Przesłano następującą liczbę poleceń: .
Kluczem do rozwiązania tego problemu jest zmniejszenie złożoności wykonywanych zadań. w GPU, podobnie jak w przypadku polecenia te etapy.
Różne
Oprócz czasu potrzebnego na wykonanie zadań system renderowania w wątku głównym występuje dodatkowy zbiór zadań nie ma nic wspólnego z renderowaniem. Czas poświęcony na wykonanie tej czynności jest raportowany jako inny czas. Czas inny zwykle oznacza pracę, która może być wykonywana w wątku UI między 2 kolejnymi klatkami renderowania.
Gdy segment jest duży
Jeśli ta wartość jest wysoka, prawdopodobnie aplikacja ma wywołania zwrotne, intencje lub inne zadania, które powinny znaleźć się w innym wątku. Narzędzia takie jak Metoda lub Systrace może dostarczyć wgląd w wykonywane zadania w wątku głównym. Te informacje pomogą Ci zwiększyć skuteczność reklam.