Ogranicz przeciąganie

Na tej stronie dowiesz się, czym jest przerysowanie, jak je zdiagnozować oraz jak je wyeliminować lub ograniczyć.

Gdy aplikacja rysuje ten sam piksel więcej niż raz w jednej klatce, nazywa się to przerysowaniem. Przerysowanie jest zwykle niepotrzebne i najlepiej je wyeliminować. Przerysowanie staje się problemem z wydajnością, gdy marnuje czas GPU na renderowanie pikseli, które nie mają wpływu na to, co użytkownik widzi na ekranie.

Informacje o przerysowaniu

Przerysowanie oznacza, że system rysuje piksel na ekranie wiele razy w jednej klatce renderowania. Jeśli na przykład masz stos kart interfejsu, każda karta zasłania część karty znajdującej się pod nią. System nadal musi jednak rysować ukryte części kart w stosie. Wynika to z faktu, że karty w stosie są renderowane zgodnie z algorytmem malarza, czyli w kolejności od tyłu do przodu. Ta sekwencja renderowania umożliwia systemowi prawidłowe zastosowanie mieszania alfa do półprzezroczystych obiektów, takich jak cienie.

Wyszukiwanie problemów z przerysowaniem

Platforma oferuje te narzędzia, które pomogą Ci określić, czy przerysowanie wpływa na wydajność Twojej aplikacji.

Narzędzie Debuguj przerysowania GPU

Narzędzie Debuguj przerysowania GPU używa kodowania kolorami, aby pokazać, ile razy aplikacja rysuje każdy piksel na ekranie. Im wyższa ta liczba, tym większe prawdopodobieństwo, że przerysowanie wpłynie na wydajność aplikacji.

Więcej informacji znajdziesz w artykule Wizualizowanie przerysowań GPU.

Narzędzie Profil renderowania GPU

Narzędzie Profil renderowania GPU wyświetla czas potrzebny na wyświetlenie pojedynczej klatki przez każdy etap potoku renderowania w postaci przewijanego histogramu. Część Proces każdego paska, oznaczona kolorem pomarańczowym, pokazuje, kiedy system przełącza bufory. Ten wskaźnik dostarcza ważnych informacji o przerysowaniu.

W przypadku mniej wydajnych GPU dostępna szybkość wypełniania, czyli szybkość, z jaką GPU może wypełnić bufor ramki, może być niska. W miarę wzrostu liczby pikseli wymaganych do narysowania klatki GPU może dłużej przetwarzać nowe polecenia i prosić resztę systemu o poczekanie, aż nadrobi zaległości. Pasek Proces pokazuje ten skok, gdy GPU jest przeciążone próbą narysowania pikseli tak szybko, jak to możliwe. Skok tego wskaźnika mogą powodować też inne problemy niż sama liczba pikseli. Jeśli na przykład narzędzie Debuguj przerysowania GPU pokazuje duże przerysowanie, a pasek Proces ma skoki, prawdopodobnie występuje problem z przerysowaniem.

Więcej informacji znajdziesz w artykule Profilowanie szybkości renderowania GPU.

Naprawianie przerysowania

Aby zmniejszyć lub wyeliminować przerysowanie, możesz wykonać te czynności:

  • Usuń niepotrzebne tła w układach.
  • Zmniejsz przezroczystość.

W tej sekcji znajdziesz informacje o obu tych metodach.

Usuwanie niepotrzebnych teł w układach

Domyślnie układ nie ma tła, co oznacza, że nie renderuje niczego bezpośrednio. Gdy jednak układy mają tło, mogą przyczyniać się do przerysowania.

Możesz poprawić wydajność renderowania, usuwając niepotrzebne tła, np. tło, które nie jest widoczne, ponieważ jest całkowicie zasłonięte przez wszystko, co aplikacja rysuje na jego wierzchu. Na przykład element podrzędny Box lub układ z modyfikatorem .background może całkowicie zasłaniać tło kontenera nadrzędnego, przez co przebieg rysowania elementu nadrzędnego jest całkowicie niewidoczny dla użytkownika, ale nadal w pełni przetwarzany przez GPU.

Aby dowiedzieć się, dlaczego przerysowujesz, sprawdź drzewo komponentów w narzędziu Layout Inspector. Możesz wyszukać tła, które nie są widoczne dla użytkownika, i je usunąć. Możesz też usunąć niepotrzebne tła wszędzie tam, gdzie jest wiele kontenerów, które mają ten sam kolor tła. Ustaw kolor tła okna na główny kolor tła aplikacji i pozostaw wszystkie kontenery nad nim bez zdefiniowanych wartości tła.

Zmniejszanie przezroczystości

Renderowanie przezroczystych pikseli na ekranie, czyli renderowanie alfa, jest główną przyczyną przerysowania. W przeciwieństwie do standardowego przerysowania, gdy system całkowicie ukrywa istniejące narysowane piksele, rysując na nich nieprzezroczyste piksele, obiekty przezroczyste wymagają najpierw narysowania istniejących pikseli, aby można było zastosować odpowiednie równanie mieszania.

Efekty wizualne, takie jak przezroczyste animacje, zanikanie i cienie, wymagają pewnej przezroczystości, a tym samym mogą znacząco przyczyniać się do przerysowania. W takich sytuacjach możesz poprawić przerysowanie, zmniejszając liczbę renderowanych przezroczystych obiektów. Na przykład możesz uzyskać szary tekst, rysując czarny tekst w elemencie kompozycyjnym Text i stosując półprzezroczystą wartość alfa za pomocą modifier = Modifier.alpha(0.5f). Ten sam efekt możesz jednak uzyskać z lepszą wydajnością, ustawiając bezpośrednio kolor tekstu elementu kompozycyjnego na nieprzezroczysty szary: color = Color.Black.copy(alpha = 0.5f).

Aby dowiedzieć się więcej o kosztach wydajności, jakie przezroczystość nakłada na cały potok rysowania, obejrzyj film Hidden Costs of Transparency.