W Android Vitals powolna sesja to taka, w której ponad 25% klatek jest spowolnionych. Klatka jest spowolniona, jeśli nie zostanie wyświetlona w ciągu 50 ms od poprzedniej klatki (odpowiednik 20 kl./s). Android Vitals zgłasza też drugie dane dotyczące powolnych sesji z wartością docelową 34 ms (odpowiednik 30 kl./s). Za pomocą powolnych sesji możesz poznać liczbę klatek, od której zależy płynność działania gry.
W przyszłości Google Play zacznie zachęcać użytkowników do odchodzenia od gier, które nie zapewniają szybkości 20 FPS na telefonach. Pamiętaj, że Android Vitals rozpoczyna monitorowanie liczby klatek dopiero po minucie gry.
Więcej informacji o tych danych znajdziesz w Centrum pomocy.
Jak mierzyć liczbę klatek na sekundę i wykrywać spowolnione klatki
Polecenie dumpsys SurfaceFlinger --timestats na Androidzie podaje średnią liczbę klatek na sekundę i histogramy czasu od wyświetlenia do wyświetlenia dla wszystkich renderowanych warstw. Czas od wyświetlenia do wyświetlenia klatki to odstęp między narysowaniem bieżącej klatki a narysowaniem poprzedniej klatki. Aby użyć polecenia do zbierania danych o FPS w grze, wykonaj te czynności:
Aby rozpocząć zbieranie informacji, uruchom polecenie z flagami
enableiclear:adb shell dumpsys SurfaceFlinger --timestats -clear -enableGdy gra będzie działać wystarczająco długo, uruchom ponownie polecenie z flagą
dump, aby zrzucić informacje:adb shell dumpsys SurfaceFlinger --timestats -dumpZrzut informacji zawiera łączną liczbę klatek i histogram
presentToPresentdla wszystkich warstw renderowanych przez SurfaceFlinger. Musisz znaleźć sekcję gry, filtrując według tych kryteriów:layerNamelayerName = SurfaceView[com.google.test/com.devrel.MainActivity]@0(BLAST)#132833Możesz obliczyć odsetek powolnych klatek w sesji na podstawie informacji o każdej warstwie.
Na przykład odsetek powolnych klatek przy 20 FPS = (suma wartości od 54 ms do 1000 ms) / totalFrames x 100
totalFrames = 274 ... presentToPresent histogram: 0ms=0 1ms=0 2ms=0 3ms=0 4ms=0 5ms=0 6ms=0 7ms=0 8ms=0 9ms=0 10ms=0 11ms=0 12ms=0 13ms=0 14ms=0 15ms=0 16ms=1 17ms=0 18ms=0 19ms=0 20ms=0 21ms=0 22ms=0 23ms=0 24ms=0 25ms=0 26ms=0 27ms=0 28ms=0 29ms=0 30ms=0 31ms=0 32ms=0 33ms=269 34ms=0 36ms=0 38ms=0 40ms=0 42ms=0 44ms=0 46ms=0 48ms=0 50ms=1 54ms=0 58ms=0 62ms=0 66ms=0 70ms=1 74ms=0 78ms=0 82ms=0 86ms=0 90ms=0 94ms=0 98ms=0 102ms=0 106ms=0 110ms=0 114ms=0 118ms=0 122ms=0 126ms=0 130ms=0 134ms=0 138ms=0 142ms=0 146ms=0 150ms=0 200ms=0 250ms=0 300ms=0 350ms=0 400ms=0 450ms=0 500ms=0 550ms=0 600ms=0 650ms=0 700ms=0 750ms=0 800ms=0 850ms=0 900ms=0 950ms=0 1000ms=0W zrzucie jest też podana średnia liczba klatek na sekundę dla każdej warstwy:
... averageFPS = 30.179 ...Po zebraniu wszystkich informacji wyłącz timestats za pomocą flagi
disable:adb shell dumpsys SurfaceFlinger --timestats -disable
Przyczyny i rozwiązania problemu z powolnym renderowaniem klatek
Istnieje wiele powodów, dla których klatka może być wyświetlana lub renderowana na ekranie dłużej niż docelowo. Gra może być ograniczona przez procesor lub GPU, urządzenie może się przegrzewać i aktywować stan ograniczenia termicznego lub może występować niezgodność między liczbą klatek na sekundę w grze a częstotliwością odświeżania wyświetlacza urządzenia.
Aby rozwiązać te problemy i poprawić wydajność gry, użyj Android Frame Pacing (Swappy), Vulkan i ADPF.
Czym jest Swappy
Biblioteka Frame Pacing na Androida, znana też jako Swappy, jest częścią bibliotek AGDK. Swappy pomaga grom OpenGL i Vulkan osiągnąć płynne renderowanie i prawidłowe tempo klatek na Androidzie.
Tempo klatek to synchronizacja logiki gry i pętli renderowania z podsystemem wyświetlania systemu operacyjnego i podstawowym sprzętem wyświetlającym. Podsystem wyświetlania Androida został zaprojektowany tak, aby unikać artefaktów wizualnych (tzw. rwania), które mogą wystąpić, gdy sprzęt wyświetlający przełącza się na nową klatkę w trakcie aktualizacji. Aby uniknąć tych artefaktów, podsystem wyświetlania wykonuje te czynności:
- Wewnętrznie buforuje poprzednie klatki.
- Wykrywa opóźnione przesyłanie klatek.
- Powtarza wyświetlanie poprzednich klatek, gdy wykryje opóźnione klatki.
Dowiedz się, jak twórcy gry Mir 2 wykorzystali Swappy, aby zmniejszyć współczynnik powolnych sesji z 40% do 10%.
Jak używać Swappy w projektach natywnych
Aby zintegrować bibliotekę Android Frame Pacing ze swoją grą, zapoznaj się z tymi przewodnikami:
- Integrowanie Android Frame Pacing z mechanizmem renderowania OpenGL
- Integracja Android Frame Pacing z renderowaniem Vulkan
Jak używać Swappy w silniku gry Unity
Firma Unity zintegrowała Android Frame Pacing ze swoim silnikiem. Aby włączyć tę funkcję w Unity 2019.2 lub nowszej wersji, zaznacz pole wyboru Optimized Frame Pacing (Zoptymalizowana częstotliwość klatek) w sekcji Project Settings > Player > Settings (Ustawienia projektu > Odtwarzacz > Ustawienia) w Android > Resolution and Presentation (Android > Rozdzielczość i prezentacja):
Możesz też automatycznie włączyć opcję zoptymalizowanego tempa klatek w kodzie logicznym, aby umożliwić Unity równomierne rozprowadzanie klatek i zmniejszyć różnice w liczbie klatek, co zapewni płynniejszą rozgrywkę.
Jak używać Swappy w silniku gry Unreal
Unreal 4.25 i nowsze wersje zawierają bibliotekę Android Frame Pacing, która jest częścią Android Game Development Kit. W artykule Zarządzanie tempem renderowania klatek na urządzeniach mobilnych wyjaśniono, jak włączyć bibliotekę Android Frame Pacing i jak kontrolować tempo renderowania klatek za pomocą kodu C++.
Czym jest Vulkan
Vulkan to nowoczesny, wieloplatformowy interfejs API do obsługi grafiki 3D, który minimalizuje abstrakcję między sprzętem graficznym urządzenia a grą. Vulkan to podstawowy niskopoziomowy interfejs API grafiki na Androidzie, który zastępuje OpenGL ES. OpenGL ES jest nadal obsługiwany na Androidzie, ale nie jest już aktywnie rozwijany.
Vulkan ma te zalety w porównaniu z OpenGL ES:
- bardziej wydajną architekturę z mniejszym obciążeniem procesora w sterowniku graficznym;
- Nowe strategie optymalizacji poprawiające wydajność procesora
- Nowe funkcje graficzne niedostępne w OpenGL ES, takie jak interfejsy API bez powiązań i śledzenie promieni.
Jak używać interfejsu Vulkan w natywnych projektach aplikacji na Androida
Ćwiczenie z programowania Pierwsze kroki z Vulkanem na Androidzie przeprowadzi Cię przez proces konfigurowania potoku renderowania Vulkana, a następnie renderowania teksturowanego, obracającego się trójkąta na ekranie. Z tego ćwiczenia dowiesz się, jak renderować grafikę w grze.
Jak używać Vulkana w silniku gry Unity
Aby włączyć automatyczny wybór urządzenia w Unity, wykonaj czynności opisane w sekcji dotyczącej konfigurowania interfejsu Auto Graphics API.
Możesz też włączyć interfejs Vulkan ręcznie, wyłączając Auto Graphics API i ustawiając interfejs Vulkan jako najwyższy priorytet na liście Graphics APIs. Jeśli używasz Unity 2021.1 lub starszej wersji, jest to jedyny sposób korzystania z Vulkana.
Użyj wtyczki VkQuality do silnika Unity, aby uzyskać rekomendacje dotyczące interfejsu Graphics API, którego gra powinna używać na określonych urządzeniach.
Jak używać interfejsu Vulkan w silniku gry Unreal
Aby włączyć interfejs Vulkan Graphics API, kliknij Project Settings > Platforms > Android > Build (Ustawienia projektu > Platformy > Android > Kompilacja) i wybierz Support Vulkan (Obsługa Vulkan). Jeśli wybierzesz zarówno Obsługuj Vulkan, jak i Obsługuj OpenGL ES3.2, Unreal domyślnie użyje Vulkan. Jeśli urządzenie nie obsługuje platformy Vulkan, Unreal używa OpenGL ES 3.2.
Jeśli używasz określonych funkcji Vulkan, które nie działają prawidłowo na niektórych urządzeniach, możesz dostosować plik BaseDeviceProfile.ini, aby wykluczyć te urządzenia. Aby dowiedzieć się, jak dostosować BaseDeviceProfile.ini, przeczytaj artykuł Customizing Device Profiles and Scalability for Android (Dostosowywanie profili urządzeń i skalowalności na Androidzie). Nowe sterowniki urządzeń mogą rozwiązywać problemy z urządzeniami, które wcześniej działały nieprawidłowo, dlatego aktualizuj plik BaseDeviceProfile.ini, aby korzystać ze wszystkich optymalizacji.
Czym jest ADPF
Android Dynamic Performance Framework (ADPF) optymalizuje gry na podstawie dynamicznych funkcji zarządzania temperaturą, procesorem i GPU na Androidzie. Nacisk kładziony jest na gry, ale możesz też używać tych funkcji w innych aplikacjach, które wymagają dużej wydajności.
ADPF to zestaw interfejsów API, które umożliwiają grom i aplikacjom wymagającym dużej wydajności bardziej bezpośrednią interakcję z systemami zasilania i chłodzenia urządzeń z Androidem. Dzięki tym interfejsom API możesz monitorować dynamiczne zachowanie systemów Android i optymalizować wydajność gier na stałym poziomie, który nie powoduje przegrzewania się urządzeń.
Oto główne funkcje ADPF:
- Thermal API: monitoruje stan termiczny urządzenia, dzięki czemu aplikacja może proaktywnie dostosowywać obciążenie, zanim stanie się ono zbyt duże.
- Interfejs CPU Performance Hint API: dostarcza wskazówki dotyczące wydajności, które pozwalają Androidowi wybrać odpowiednie ustawienia wydajności (np. punkt pracy procesora lub rdzeń) dla danego obciążenia.
- Interfejsy Game Mode API i Game State API: umożliwiają optymalizację rozgrywki przez nadanie priorytetu wydajności lub czasowi pracy na baterii na podstawie ustawień użytkownika i konfiguracji konkretnej gry.
- Tryb stałej wydajności: włącz tryb stałej wydajności na urządzeniu podczas testów porównawczych, aby uzyskać pomiary, które nie są zmieniane przez dynamiczne taktowanie procesora.
- Tryb oszczędzania energii: wskazuje sesji, że wątki w sesji wskazówek dotyczących wydajności można bezpiecznie zaplanować tak, aby preferowały oszczędzanie energii, a nie wydajność. Dostępne na Androidzie 15 (poziom API 35).
Jak używać ADPF w natywnych projektach aplikacji na Androida
Ćwiczenie z programowania Integrowanie funkcji adaptacyjnych z grą natywną pomoże Ci zintegrować funkcje ADPF z grą. Możesz je wykonać we własnym tempie. Po ukończeniu tego ćwiczenia zintegrujesz te funkcje:
- Thermal API: monitoruj temperaturę urządzenia i reaguj, zanim urządzenie przejdzie w stan dławienia termicznego.
- Game Mode API: poznaj preferencje graczy dotyczące optymalizacji (maksymalizacja wydajności lub oszczędzanie baterii) i odpowiednio dostosuj grę.
- Game State API: informuje system o stanie gry (ładowanie, rozgrywka, interfejs itp.), dzięki czemu system może odpowiednio dostosować zasoby (zwiększyć wejście/wyjście, moc procesora, GPU itp.).
- Performance Hint API: poinformuj system o swoim modelu wątków i obciążeniu, aby mógł odpowiednio przydzielić zasoby.
Jak używać ADPF w silniku gry Unity
Adaptive Performance w Unity to narzędzie dla deweloperów gier, którzy chcą optymalizować swoje gry na urządzenia mobilne, zwłaszcza w zróżnicowanym ekosystemie Androida. Adaptive Performance umożliwia grze dostosowywanie się do wydajności i charakterystyki termicznej urządzenia w czasie rzeczywistym, co zapewnia płynną i wydajną rozgrywkę.
Dostawca Adaptive Performance na Androida przeprowadzi Cię przez proces wdrażania ADPF w Unity. Zobacz też ADPF Unity Adaptive Performance and Android provider.
Jak używać ADPF w silniku gry Unreal
- Pobierz wtyczkę.
- Skopiuj wtyczkę do folderu wtyczek projektu.
- Włącz wtyczkę ADPF Unreal Engine w edytorze Unreal.
- Uruchom ponownie edytor Unreal.
- Skompiluj i przygotuj grę.
Wtyczka Android Dynamic Performance Framework (ADPF) do Unreal Engine zapewnia stabilną wydajność i zapobiega ograniczaniu wydajności z powodu przegrzewania. Pobierz wtyczkę z GitHuba. Ta wtyczka zmienia funkcje, ustawiając wartości konsoli Unreal. Więcej informacji znajdziesz we wtyczce ADPF do Unreal Engine.