Android zawiera niektóre opcje programistyczne na urządzeniu, które pomagają wizualizować miejsca, w których aplikacja może mieć problemy z renderowaniem interfejsu, np. wykonywanie większej liczby operacji renderowania niż jest to konieczne lub wykonywanie długich operacji na wątkach i GPU. Na tej stronie dowiesz się, jak debugować przerysowania GPU i profilować renderowanie GPU.
Więcej informacji o opcjach programisty na urządzeniu, w tym o tym, jak je włączyć, znajdziesz w artykule Konfigurowanie opcji programisty na urządzeniu.
Profilowanie szybkości renderowania GPU
Narzędzie Profil renderowania GPU wyświetla w postaci przewijanego histogramu wizualną reprezentację czasu renderowania klatek okna interfejsu w porównaniu z wartością referencyjną 16,67 ms na klatkę.
W przypadku mniej wydajnych procesorów GPU dostępny współczynnik wypełnienia (szybkość, z jaką procesor GPU może wypełnić bufor ramki) może być dość niski. Wraz ze wzrostem liczby pikseli potrzebnych do narysowania klatki GPU może potrzebować więcej czasu na przetworzenie nowych poleceń, co powoduje, że reszta systemu musi czekać, aż GPU nadrobi zaległości.
Narzędzie do profilowania pomaga określić, kiedy układ GPU jest przeciążony podczas próby rysowania pikseli lub gdy jest obciążony dużym przerysowaniem.
Włączanie profilera
Zanim zaczniesz, upewnij się, że używasz urządzenia z Androidem 4.1 (poziom API 16) lub nowszym i włączasz opcje programisty. Aby rozpocząć profilowanie renderowania na GPU urządzenia podczas korzystania z aplikacji, wykonaj te czynności:
- Na urządzeniu otwórz Ustawienia i kliknij Opcje programisty.
- W sekcji Monitorowanie wybierz Profil renderowania GPU lub Profil renderowania HWUI w zależności od wersji Androida na urządzeniu.
- W oknie Profilowanie renderowania GPU wybierz Na ekranie jako paski, aby nałożyć wykresy na ekran urządzenia.
- Otwórz aplikację, której profil chcesz utworzyć.
Sprawdzanie danych wyjściowych
Na powiększonym obrazie wykresu renderowania GPU w profilu, który widzisz na rysunku 1, możesz zobaczyć kolorową sekcję wyświetlaną na Androidzie 6.0 (poziom interfejsu API 23).
Rysunek 1. Powiększony wykres profilu renderowania GPU.
Oto kilka kwestii, na które warto zwrócić uwagę w przypadku danych wyjściowych:
- Dla każdej widocznej aplikacji narzędzie wyświetla wykres.
- Każdy słupek pionowy wzdłuż osi poziomej reprezentuje ramkę, a jego wysokość to czas renderowania ramki (w milisekundach).
- Pozioma zielona linia oznacza 16,67 milisekundy. Aby uzyskać 60 klatek na sekundę, pionowy słupek dla każdej klatki musi znajdować się poniżej tej linii. Jeśli pasek przekroczy tę linię, animacje mogą zostać wstrzymane.
- Narzędzie wyróżnia klatki, które przekraczają próg 16,67 ms, poprzez poszerzenie odpowiedniego słupka i zmniejszenie jego przezroczystości.
- Każdy słupek ma kolorowe komponenty, które odpowiadają etapowi w potoku renderowania. Liczba komponentów różni się w zależności od poziomu interfejsu API urządzenia.
W tabeli poniżej znajdziesz opisy poszczególnych segmentów słupka w danych wyjściowych profilera, gdy używasz urządzenia z Androidem 6.0 lub nowszym.
| Element paska | Etap renderowania | Opis |
|---|---|---|
| Zamiana buforów | Czas, w którym procesor czeka na zakończenie pracy przez GPU. Jeśli ten słupek jest wysoki, oznacza to, że aplikacja wykonuje zbyt dużo pracy na procesorze graficznym. | |
| Problem z poleceniem | Określa czas, w którym moduł renderowania 2D Androida wydaje polecenia do OpenGL, aby rysować i ponownie rysować listy wyświetlania. Wysokość tego paska jest wprost proporcjonalna do sumy czasu potrzebnego na wykonanie każdej listy wyświetlania – im więcej list wyświetlania, tym wyższy czerwony pasek. | |
| Synchronizacja i przesyłanie | Czas potrzebny na przesłanie informacji o bitmapie do GPU. Duży segment oznacza, że aplikacja potrzebuje dużo czasu na wczytanie dużej ilości grafiki. | |
| Narysuj |
Reprezentuje czas użyty do zarejestrowania poleceń rysowania, takich jak drawLine. W Compose ta faza może czasami obejmować operacje pomiaru i układu. Jeśli ten pasek jest wysoki, zarejestruj ślad systemu i dokładnie go przeanalizuj za pomocą narzędzia Perfetto.
|
|
| Pomiary / układ | Reprezentuje czas spędzony na pozycjonowaniu i określaniu rozmiaru komponentów interfejsu podczas fazy układu, która obejmuje wykonywanie modyfikatorów pomiaru i umieszczania. Duży segment wskazuje na złożone obliczenia w ramach tych modyfikatorów lub zbyt rozbudowane drzewo układu, które wymaga częstego ponownego obliczania. | |
| Obsługa danych wejściowych i animacja |
Określa czas potrzebny na ocenę wywołań interfejsu Animation API lub obsługę danych wejściowych wskaźnika i wywołań zwrotnych. Jeśli ten segment jest duży, może to oznaczać, że niestandardowa animacja lub wywołanie zwrotne danych wejściowych zajmuje zbyt dużo czasu na przetwarzanie. Obliczenia stanu i mapowanie danych podczas przewijania LazyColumn lub LazyRow
również zwykle występują w tym segmencie i są częstszym źródłem
spowolnień w tym segmencie.
|
|
| Różne opóźnienia czasowe / opóźnienia synchronizacji pionowej | Określa czas, w którym aplikacja wykonuje operacje między 2 kolejnymi klatkami. Może to oznaczać, że w wątku UI odbywa się zbyt dużo przetwarzania, które można przenieść do innego wątku. |
Tabela 1. Paski komponentów na urządzeniach z Androidem w wersji 6.0 lub nowszej.
Więcej informacji o interpretowaniu danych dostarczanych przez narzędzie do profilowania znajdziesz w artykule Analizowanie za pomocą narzędzia Profile GPU Rendering.