Na tej stronie wyjaśniamy, czym jest przerysowanie, jak go diagnozować oraz jak go wyeliminować lub ograniczyć.
Jeśli aplikacja rysuje ten sam piksel więcej niż raz w ramach jednej klatki, jest to tzw. przerysowanie. Przeciąganie jest zwykle niepotrzebne i najlepiej go wyeliminować. Przeciąganie staje się problemem z wydajnością, ponieważ GPU traci czas na renderowanie pikseli, które nie mają wpływu na to, co użytkownik widzi na ekranie.
Informacje o przerysowywaniu
Przeciąganie oznacza wielokrotne rysowanie przez system piksela na ekranie w ramach pojedynczej klatki renderowania. Jeśli na przykład masz kilka kart interfejsu, każda z nich ukrywa część tej, która jest pod nią.
System musi jednak narysować ukryte fragmenty kart. Dzieje się tak, ponieważ karty warstwowe są renderowane zgodnie z algorytmem malarza, czyli w kolejności ułożonej od podstaw. Ta sekwencja renderowania pozwala systemowi zastosować odpowiednie przenikanie alfa do półprzezroczystych obiektów, takich jak cienie.
Znajdź problemy z przerysowaniem
Platforma udostępnia te narzędzia, które pomagają określić, czy przerysowywanie aplikacji wpływa na wydajność aplikacji.
Narzędzie do debugowania przerysowywania GPU
Narzędzie Debugowanie GPU Overrysowanie za pomocą kolorów wskazuje, ile razy na ekranie aplikacja rysowała każdy piksel. Im wyższa jest ta liczba, tym większe prawdopodobieństwo, że przerysowanie wpływa na wydajność aplikacji.
Więcej informacji znajdziesz w sekcji Wizualizacja przerysowania GPU.
Narzędzie do renderowania GPU
Narzędzie do renderowania GPU w profilach wyświetla czas potrzebny na wyświetlenie pojedynczej klatki w postaci przewijającego histogramu. Sekcja Proces (w kolorze pomarańczowym) każdego słupka pokazuje, kiedy system zamienia bufory. Te dane dostarczają ważnych wskazówek na temat przerysowania.
W przypadku mniej wydajnych GPU dostępny współczynnik wypełnienia, czyli szybkość, z jaką GPU może wypełnić bufor klatki, może być niska. W miarę jak zwiększa się liczba pikseli wymaganych do narysowania klatki, GPU może potrzebować więcej czasu na przetworzenie nowych poleceń i poczekanie na reakcję przez system. Pasek Process pokazuje ten skok, gdy procesor graficzny jest przeciążony podczas pobierania pikseli tak szybko, jak to możliwe. Nagły wzrost wartości mogą też powodować problemy inne niż nieprzetworzona liczba pikseli. Jeśli na przykład narzędzie Debugowanie GPU Overrysowanie pokazuje intensywne przerysowania i gwałtowne skoki procesu, prawdopodobnie występuje problem z przerysowywaniem.
Więcej informacji znajdziesz w sekcji Szybkość renderowania GPU.
Napraw przerysowywanie
Aby ograniczyć lub wyeliminować przeciągnięcie, możesz wykonać te czynności:
- Usuń niepotrzebne tła z układów.
- Spłaszcz hierarchię widoków.
- Zmniejsz przejrzystość.
W tej sekcji znajdziesz informacje o każdym z tych podejść.
Usuń niepotrzebne tła z układów
Domyślnie układ nie ma tła, co oznacza, że nie renderuje niczego bezpośrednio. Jednak gdy układy mają tło, mogą powodować przerysowanie.
Możesz poprawić wydajność renderowania, usuwając niepotrzebne tła. Niepotrzebne tło może nie być widoczne, ponieważ jest całkowicie zakryte przez wszystko, co na nim rysuje aplikacja. Na przykład system może całkowicie zasłaniać tło rodzica, gdy rysuje na nim widoki podrzędne.
Aby dowiedzieć się, dlaczego zawyżasz wartość, zapoznaj się z hierarchią w narzędziu Inspektor układu. Możesz poszukać tła, które są niewidoczne dla użytkownika, i je wyeliminować. Zbędne tło możesz wyeliminować, gdy wiele kontenerów ma ten sam kolor tła. Możesz ustawić główny kolor tła okna aplikacji i pozostawić wszystkie kontenery nad nim bez zdefiniowanych wartości tła.
Spłaszcz hierarchię widoków
Nowoczesne układy pomagają układać widoki w stosy i nakładać je na siebie, tworząc piękny projekt. Może to jednak obniżyć wydajność, ponieważ spowoduje to przerysowanie, zwłaszcza w sytuacjach, gdy każdy skumulowany obiekt widoku jest nieprzezroczysty, co wymaga narysowania na ekranie zarówno widocznych, jak i niewidocznych pikseli.
Jeśli napotkasz ten problem, możesz zwiększyć skuteczność, optymalizując hierarchię widoków danych, aby zmniejszyć liczbę nakładających się obiektów interfejsu. Aby dowiedzieć się, jak to zrobić, przeczytaj artykuł Wydajność i hierarchie widoków.
Zmniejsz przezroczystość
Renderowanie przezroczystych pikseli na ekranie (tzw. renderowanie alfa) często przyczynia się do przerysowywania elementów. W przeciwieństwie do standardowego przerysowania – gdy system całkowicie ukrywa istniejące już narysowane piksele, rysując na nich nieprzezroczyste piksele – w przypadku przezroczystych obiektów najpierw trzeba narysować istniejące piksele, aby można było uzyskać odpowiednie połączenie.
Efekty wizualne, takie jak przezroczyste animacje, przyciemnienia i cienie, wymagają pewnej przezroczystości i mogą w znacznym stopniu przyczyniać się do przerysowywania. Aby w takich sytuacjach poprawić przerysowywanie, zmniejsz liczbę renderowanych przezroczystych obiektów. Możesz na przykład uzyskać szary tekst, rysując w elemencie TextView
czarny tekst z półprzezroczystą wartością alfa. Ten sam efekt można uzyskać, rysując tekst na szaro.
Aby dowiedzieć się więcej o kosztach wydajności, jakie przejrzystość nakłada na cały proces rysowania, obejrzyj film Ukryte koszty przejrzystości.