Sprawdź szybkość renderowania GPU i przerysowywanie

Android udostępnia kilka opcji dla programistów dostępnych na urządzeniu. Pomagają one zwizualizować miejsca, w których mogą występować problemy z renderowaniem interfejsu aplikacji. Przykładem może być większa liczba operacji renderowania niż to konieczne lub wykonywanie długich operacji na wątkach i układach graficznych. Na tej stronie opisujemy, jak debugować przerysowywanie GPU i profilowanie renderowania GPU.

Więcej informacji o opcjach programisty na urządzeniu, w tym o ich włączeniu, znajdziesz w artykule Konfigurowanie opcji programisty na urządzeniu.

Profiluj szybkość renderowania GPU

Narzędzie do renderowania GPU w postaci histogramu przedstawia wizualną reprezentację czasu potrzebnego na wyrenderowanie klatek interfejsu w stosunku do wartości porównawczej 16,67 ms na klatkę.

W przypadku mniej wydajnych GPU dostępny współczynnik wypełnienia (szybkość, z którą GPU może wypełnić bufor klatki) może być dość niska. Wraz ze wzrostem liczby pikseli wymaganych do narysowania klatki GPU przetwarza nowe polecenia z opóźnieniem i wymaga czasu, by reszta systemu poczekała, aż złapie z rzeczywistości. Narzędzie do profilowania pomaga określić, kiedy GPU jest przeciążone podczas rysowania pikseli lub przeciążone.

Włącz program profilujący

Zanim zaczniesz, upewnij się, że używasz urządzenia z Androidem 4.1 (poziom interfejsu API 16) lub nowszym i masz włączone opcje dla programistów. Aby rozpocząć profilowanie renderowania GPU urządzenia podczas korzystania z aplikacji, wykonaj te czynności:

  1. Na urządzeniu otwórz Ustawienia i kliknij Opcje programisty.
  2. W sekcji Monitorowanie wybierz Profilowanie GPU lub Renderowanie HWUI profilu w zależności od wersji Androida uruchomionej na urządzeniu.
  3. W oknie Profilu renderowania GPU wybierz Na ekranie jako paski, aby nakładać wykresy na ekran urządzenia.
  4. Otwórz aplikację, której profil chcesz profilować.

Sprawdzanie danych wyjściowych

Na powiększonym obrazie wykresu Renderowanie GPU w Profilu widocznych na ilustracji 1 widać kolorową sekcję, jak widać na Androidzie 6.0 (poziom interfejsu API 23).

Rysunek 1. Powiększony wykres renderowania GPU w profilu.

Kilka uwag na temat wyników:

  • Dla każdej widocznej aplikacji narzędzie wyświetla wykres.
  • Każdy pionowy pasek wzdłuż osi poziomej reprezentuje ramkę, a wysokość każdego pionowego słupka odzwierciedla czas renderowania klatki (w milisekundach).
  • Pozioma zielona linia pokazuje 16,67 milisekundy. Aby można było uzyskać 60 klatek na sekundę, pionowy pasek każdej klatki musi znajdować się poniżej tej linii. Za każdym razem, gdy słupek przekracza tę linię, animacje mogą zawierać przerwy.
  • Narzędzie wyróżnia klatki, które przekraczają próg 16,67 milisekundy, zwiększając w ten sposób szerokość i przezroczystość odpowiadającego mu paska.
  • Każdy słupek zawiera kolorowe komponenty, które mapują się na etap w potoku renderowania. Liczba komponentów zależy od poziomu interfejsu API urządzenia.

W tabeli poniżej znajdziesz opisy poszczególnych segmentów pionowego paska w danych wyjściowych programu profilującego występujące na urządzeniach z Androidem 6.0 lub nowszym.

Komponent słupkaEtap renderowaniaOpis
Zamień bufory Reprezentuje czas, przez jaki procesor czeka na zakończenie pracy GPU. Jeśli pasek jest wysoki, oznacza to, że aplikacja za dużo wykorzystuje GPU.
Problem z poleceniem Reprezentuje czas poświęcany przez mechanizm renderowania 2D Androida na wykonywanie poleceń do OpenGL w celu rysowania i ponownego rysowania list wyświetlania. Wysokość tego słupka jest proporcjonalna do sumy czasu potrzebnego na wykonanie poszczególnych list wyświetlania – im więcej list wyświetlania, tym wyższy jest czerwony pasek.
Synchronizacja i przesyłanie Reprezentuje czas potrzebny na przesłanie informacji o mapie bitowej do GPU. Duży segment oznacza, że wczytywanie dużej ilości grafiki przez aplikację zajmuje dużo czasu.
Rysowanie Reprezentuje czas użyty do utworzenia i zaktualizowania list wyświetlanych w widoku. Jeśli ta część paska jest wysoka, może być wiele zadań do rysowania w widoku niestandardowych lub dużo pracy w metodach onDraw.
Miara / układ Reprezentuje czas spędzony na wywołaniach zwrotnych onLayout i onMeasure w hierarchii widoków. Duży segment wskazuje, że przetwarzanie hierarchii widoków zajmuje dużo czasu.
Obsługa wprowadzania i animacja Reprezentuje czas potrzebny na ocenę wszystkich animatorów uruchomionych w przypadku tej klatki i obsłużenie wszystkich wejściowych wywołań zwrotnych. Jeśli segment jest duży, może to oznaczać, że niestandardowy animator lub wywołanie zwrotne trwa zbyt długo. Powiązanie widoku podczas przewijania, np. RecyclerView.Adapter.onBindViewHolder(), zwykle ma też miejsce w tym segmencie i jest częstszym źródłem spowolnień w tym segmencie.
Różne czasy / opóźnienie synchronizacji pionowej Reprezentuje czas wykonywania działań przez aplikację między 2 kolejnymi klatkami. Może to oznaczać za dużo przetwarzania w wątku UI, które można przenieść do innego wątku.

Tabela 1. Paski komponentów w Androidzie 6.0 i nowszych.

Wersje Androida od 4.0 (poziom interfejsu API 14) do 5.0 (poziom interfejsu API 21) mają segmenty niebieski, fioletowy, czerwony i pomarańczowy. Android w wersji starszej niż 4.0 zawiera tylko komponenty niebieski, czerwony i pomarańczowy. W tabeli poniżej znajdziesz paski komponentów w Androidzie 4.0 i 5.0.

Komponent słupkaEtap renderowaniaOpis
Proces Reprezentuje czas, przez jaki procesor czeka na zakończenie pracy GPU. Jeśli ten pasek jest wysoki, oznacza to, że aplikacja za dużo wykorzystuje GPU.
Wykonaj Reprezentuje czas poświęcany przez mechanizm renderowania 2D Androida na wykonywanie poleceń do OpenGL w celu rysowania i ponownego rysowania list wyświetlania. Wysokość tego słupka jest proporcjonalna do sumy czasu potrzebnego na wykonanie poszczególnych list wyświetlania – im więcej list wyświetlania, tym wyższy jest czerwony pasek.
XFer Reprezentuje czas potrzebny na przesłanie informacji o mapie bitowej do GPU. Duży segment oznacza, że wczytywanie dużej ilości grafiki przez aplikację zajmuje dużo czasu. Ten segment jest niewidoczny na urządzeniach z Androidem 4.0 lub starszym.
Aktualizuj Reprezentuje czas użyty do utworzenia i zaktualizowania list wyświetlanych w widoku. Jeśli ta część paska jest wysoka, może być wiele zadań do rysowania w widoku niestandardowych lub dużo pracy w metodach onDraw.

Tabela 2. Paski komponentów w Androidzie 4.0 i 5.0.

Więcej informacji o interpretowaniu informacji dostarczanych przez narzędzie do profilowania znajdziesz w artykule Analiza za pomocą renderowania GPU w profilu.

Uwaga: narzędzie nosi nazwę „Profile GPU Rendering” (Renderowanie GPU), ale wszystkie monitorowane procesy faktycznie zachodzą w CPU. Renderowanie odbywa się przez przesyłanie poleceń do GPU, a GPU renderuje ekran asynchronicznie. W niektórych sytuacjach GPU może wymagać zbyt wielu zadań, a procesor musi zaczekać, zanim będzie mógł przesłać nowe polecenia. Gdy tak się stanie, na pomarańczowo i czerwonym pasku będą widoczne skoki, a przesłanie polecenia zostanie zablokowane do czasu zwolnienia miejsca w kolejce poleceń GPU.

Wizualizacja przeciągnięcia GPU

Kolejna funkcja dostępna w opcjach programistycznych pomaga wykrywać przesadne kolory w interfejsie. Przeciąganie ma miejsce, gdy aplikacja rysuje ten sam piksel więcej niż raz w tej samej ramce. Wizualizacja pokazuje więc, gdzie aplikacja może wykonywać więcej zadań renderowania, niż jest to konieczne, co może powodować problemy z wydajnością, ponieważ GPU wymaga dodatkowego nakładu pracy związanej z renderowaniem pikseli, które nie są widoczne dla użytkownika. Jeśli to możliwe, popraw przekreślone zdarzenia.

Włącz opcje programisty, jeśli nie zostało to jeszcze zrobione. Następnie, aby zwizualizować przerysowanie elementów na urządzeniu, wykonaj te czynności:

  1. Na urządzeniu otwórz Ustawienia i kliknij Opcje programisty.
  2. Przewiń w dół do sekcji Renderowanie z akceleracją sprzętową i wybierz Debuguj przerysowywanie GPU.
  3. W oknie Debuguj przerysowywanie GPU wybierz Pokaż przerysowane obszary.

Kolory elementów interfejsu Androida w celu wskazania stopnia przerysowania:

  • Prawdziwe kolory: bez przerysowywania.
  • Niebieski: 1 przerysowanie
  • Zielony: 2 przerysowania
  • Różowy: 3 razy przerysowany
  • czerwony: zdjęcie zostało przerysowane co najmniej 4 razy.

Rysunek 2. Aplikacja wygląda tak jak zwykle (po lewej) i tak, jak widać ją z włączonym przerysowywaniem GPU (po prawej)

Zwróć uwagę, że te kolory są półprzezroczyste, więc dokładny kolor na ekranie zależy od zawartości interfejsu.

Teraz gdy już wiesz, gdzie w układzie występuje przeciągnięcie, przeczytaj, jak ograniczyć przerysowywanie.

Pamiętaj, że niektórych przerysowań nie da się uniknąć. Podczas dostrajania interfejsu aplikacji staraj się uzyskać wizualizację, która pokazuje w większości prawdziwe kolory lub tylko 1-krotne przerysowanie (niebieski).

Rysunek 3. Przykłady aplikacji z dużo przerysowanym (po lewej) i znacznie mniej przerysowanym (po prawej)