Powolne sesje

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.

Grafika przypominająca wykres kołowy, która pokazuje liczbę powolnych i niepowolnych klatek.
Rysunek 1. powolna sesja w Android Vitals.

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:

  1. Aby rozpocząć zbieranie informacji, uruchom polecenie z flagami enable i clear:

    adb shell dumpsys SurfaceFlinger --timestats -clear -enable
    
  2. Gdy gra będzie działać wystarczająco długo, uruchom ponownie polecenie z flagą dump, aby zrzucić informacje:

    adb shell dumpsys SurfaceFlinger --timestats -dump
    

    Zrzut informacji zawiera łączną liczbę klatek i histogram presentToPresent dla wszystkich warstw renderowanych przez SurfaceFlinger. Musisz znaleźć sekcję gry, filtrując według tych kryteriów:layerName

    layerName = SurfaceView[com.google.test/com.devrel.MainActivity]@0(BLAST)#132833
    

    Moż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=0
    

    W zrzucie jest też podana średnia liczba klatek na sekundę dla każdej warstwy:

    ...
    averageFPS = 30.179
    ...
    
  3. 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:

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):

Okno ustawień projektu Unity z zaznaczonym polem wyboru Optimized Frame Pacing.
Rysunek 2. Włączanie Frame Pacing w silniku Unity.

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.

Okno ustawień projektu Unity z włączonym interfejsem Auto Graphics API.
Rysunek 3. Włącz interfejs Unity 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.

Okno ustawień projektu Unity z interfejsem Vulkan na liście interfejsów API grafiki.
Rysunek 4. Ręcznie wybierz Vulkan jako główny interfejs API grafiki w Unity.

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.

Okno ustawień projektu Unreal Engine z opcją Support Vulkan.
Rysunek 5. Włącz Vulkan w Unreal Engine.

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.

Okno ustawień projektu Unity z ustawieniami dostawcy Adaptive Performance na Androida.
Rysunek 6. Zintegruj ADPF z silnikiem Unity.

Jak używać ADPF w silniku gry Unreal

Okno wtyczek Unreal Engine z wtyczką Android Dynamic Performance Framework.
Rysunek 7. Integracja ADPF w Unreal Engine.
  1. Pobierz wtyczkę.
  2. Skopiuj wtyczkę do folderu wtyczek projektu.
  3. Włącz wtyczkę ADPF Unreal Engine w edytorze Unreal.
  4. Uruchom ponownie edytor Unreal.
  5. 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.