Powolne sesje

Sesja powolna to taka, w której ponad 25% klatek jest spowolnionych. Klatka jest spowolniona, jeśli nie jest wyświetlana w czasie krótszym niż 50 ms po poprzedniej klatce (odpowiednik 20 kl./s). Android Vitals podaje też drugie dane o powolnych sesjach, w przypadku których wartość docelowa wynosi 34 ms (odpowiednik 30 FPS). 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 tym wskaźniku znajdziesz w Centrum pomocy.

Wykresy kołowe pokazujące liczbę wolno i szybko wyrenderowanych klatek.
Rysunek 1. Powolna sesja w Android Vitals.
.

Jak mierzyć liczbę klatek na sekundę i wykrywać spowolnione klatki

Polecenie dumpsys surfaceflinger timestats systemu Android podaje średnią liczbę klatek na sekundę i histogram czasu od prezentacji do prezentacji dla wszystkich renderowanych warstw. Czas prezentacji do prezentacji klatki to przedział czasu między rysowaniem bieżącej i poprzedniej klatki. Oto instrukcja krok po kroku, jak użyć polecenia do zebrania danych o liczbie klatek na sekundę w grze:

  1. Aby rozpocząć rejestrowanie informacji, uruchom polecenie z flagami enableclear:

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

    adb shell dumpsys SurfaceFlinger --timestats -dump
    

    Zrzut zawiera łączną liczbę klatek i histogram presentToPresent dla wszystkich warstw renderowanych przez SurfaceFlinger. Aby znaleźć sekcję dotyczącą Twojej gry, musisz ją odfiltrować na podstawie layerName:

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

    Niska liczba klatek na sekundę w sesji może być obliczana na podstawie informacji o każdej warstwie.

    Na przykład odsetek powolnych klatek przy 20 kl./s = (suma wartości od 54 ms do 1000 ms) / liczba klatek ogółem x 100

    totalFrames = 274
    ...
    presentToPresent histogram is as below:
    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 wyświetlana jest też średnia liczba klatek na sekundę każdej warstwy:

    ...
    averageFPS = 30.179
    ...
    
  3. Po zebraniu wszystkich informacji wyłącz statystyki czasu za pomocą flagi disable:

    adb shell dumpsys SurfaceFlinger --timestats -disable
    

Przyczyny i rozwiązania problemu z wolnym renderowaniem klatek

Istnieje wiele powodów, dla których klatka może być wyświetlana na ekranie dłużej niż zamierzony czas przez dewelopera. Gra może być ograniczona przez procesor lub kartę graficzną. lub urządzenie się przegrzewa i włącza stan ograniczenia termicznego. Może też wystąpić niezgodność między liczbą klatek na sekundę w grze a częstotliwością odświeżania ekranu urządzenia.

Aby rozwiązać te problemy i poprawić wydajność gry, użyj synchronizacji klatek na Androidzie (Swappy), VulkanADPF.

Czym jest Swappy

Biblioteka Frame Pacing na Androida, znana też jako Swappy, jest częścią bibliotek AGDK. Swappy pomaga grom korzystającym z interfejsów OpenGL i Vulkan osiągnąć płynne renderowanie i prawidłowe tempo klatek na Androidzie.

Synchronizacja klatek to synchronizacja logiki gry i pętli renderowania z podsystemem wyświetlania systemu operacyjnego i sprzętem wyświetlającym. Podsystem wyświetlania Androida został zaprojektowany tak, aby unikać artefaktów wizualnych (tzw. rozrywania), które mogą wystąpić, gdy sprzęt wyświetlacza przełączy się na nową klatkę w trakcie aktualizacji. Aby uniknąć tych artefaktów, podsystem wyświetlania wykonuje te czynności:

  • buforuje poprzednie klatki wewnętrznie,
  • Wykrywa przesłanie klatki po terminie
  • Powtarza wyświetlanie poprzednich klatek, gdy wykryje opóźnione klatki.

Dowiedz się, jak Mir 2 użył Swappy, aby zmniejszyć współczynnik powolnych sesji z 40% do 10%.

Jak używać Swappy w projektach natywnych

Aby zintegrować bibliotekę Android Frame Pacing z grą, zapoznaj się z tymi przewodnikami:

Jak używać Swappy w silniku gier Unity

Unity zintegrowało z silnikiem funkcję Android Frame Pacing. Aby włączyć tę funkcję w Unity 2019.2 lub nowszej wersji, zaznacz pole wyboru Zoptymalizowane tempo klatek w sekcji Ustawienia projektu > Odtwarzacz > Ustawienia dla Androida > Rozdzielczość i prezentacja:

Okno Ustawienia projektu.
Rysunek 2. Włącz Frame Pacing w Unity Engine.

Możesz też programowo włączyć opcję zoptymalizowanego tempa klatek w kodzie logiki, aby umożliwić Unity równomierne rozłożenie klatek i zmniejszyć wariancję liczby klatek na sekundę, co zapewni płynniejszą rozgrywkę.

Jak korzystać z Swappy w silniku gier Unreal

Unreal w wersji 4.25 i nowszej zawiera bibliotekę Android Frame Pacing Library, która jest częścią Android Game Development Kit. Z artykułu Mobile Frame Pacing dowiesz się, jak włączyć bibliotekę Android Frame Pacing i jak kontrolować tempo klatek za pomocą kodu C++.

Czym jest Vulkan

Vulkan to nowoczesny, wieloplatformowy interfejs API grafiki 3D, który ma na celu zminimalizowanie abstrakcji między sprzętem graficznym urządzenia a grą. Vulkan jest podstawowym interfejsem API grafiki niskiego poziomu na Androidzie, który zastępuje OpenGL ES. OpenGL ES jest nadal obsługiwany na Androidzie, ale nie jest już aktywnie rozwijany.

Vulkan ma w porównaniu z OpenGL ES te zalety:

  • wydajniejsza architektura z mniejszym obciążeniem procesora w sterowniku graficznym,
  • Nowe strategie optymalizacji zwiększające wydajność procesora
  • Nowe funkcje graficzne niedostępne w OpenGL ES, takie jak interfejsy API bez powiązań i śledzenie promieni

Jak używać platformy Vulkan w natywnych projektach na Androida

Ćwiczenie Wprowadzenie do interfejsu Vulkan na Androidzie zawiera instrukcje dotyczące konfigurowania potoku renderowania Vulkan, a następnie renderowania na ekranie teksturowanego, obracającego się trójkąta. Z tego przewodnika dowiesz się, jak renderować grafikę w grze.

Jak używać interfejsu Vulkan w silniku gier Unity

Aby włączyć automatyczny wybór urządzenia w Unity, wykonaj czynności opisane w sekcji konfigurowania automatycznego interfejsu Graphics API.

Okno Ustawienia projektu.
Rysunek 3. Włącz Unity Auto Graphics API.

Możesz też włączyć Vulkan ręcznie, wyłączając Automatyczny interfejs API grafiki i ustawiając Vulkan na najwyższym priorytecie na liście Interfejsy API grafiki. Jeśli używasz Unity 2021.1 lub starszej wersji, jest to jedyny sposób na korzystanie z Vulkana.

Okno Ustawienia projektu.
Rysunek 4. Ręcznie wybierz Vulkan jako główny interfejs API grafiki w Unity.

Użyj wtyczki silnika Unity VkQuality, aby podawać rekomendacje dotyczące interfejsu API grafiki, z którego gra ma korzystać na konkretnych urządzeniach, w momencie uruchomienia.

Jak korzystać z interfejsu Vulkan w silniku gry Unreal

Aby włączyć interfejs graficzny Vulkan API, otwórz Ustawienia projektu > Platformy > Android > Kompilacja i wybierz Obsługa Vulkan. Jeśli wybierzesz zarówno Obsługa Vulkan, jak i Obsługa OpenGL ES3.2, Unreal będzie domyślnie używać Vulkan. Jeśli urządzenie nie obsługuje Vulkan, Unreal przełączy się na OpenGL ES 3.2.

Okno Ustawienia projektu.
Rysunek 5. Włącz Vulkan w Unreal Engine.

Jeśli używasz określonych funkcji Vulkan, które na niektórych urządzeniach działają nieprawidłowo, możesz dostosować plik BaseDeviceProfile.ini, aby wykluczyć te urządzenia. Więcej informacji o dostosowywaniu BaseDeviceProfile.ini znajdziesz w artykule Dostosowywanie profili urządzeń i skalowalność na Androidzie. Nowe sterowniki urządzeń mogą naprawić wcześniej znane problemy z urządzeniami, dlatego aktualizuj plik BaseDeviceProfile.ini, aby uzyskać wszystkie optymalizacje.

Co to jest ADPF

Android Dynamic Performance Framework (ADPF) optymalizuje gry na podstawie dynamicznych funkcji zarządzania temperaturą, procesorem i GPU na Androidzie. Funkcje te są przeznaczone głównie do gier, ale możesz ich używać też w przypadku innych aplikacji wymagających dużej mocy obliczeniowej.

ADPF to zestaw interfejsów API, które umożliwiają grom i aplikacjom wymagającym dużej mocy obliczeniowej bardziej bezpośrednią interakcję z systemami zasilania i termicznymi urządzeń z Androidem. Dzięki tym interfejsom API możesz monitorować dynamiczne zachowanie systemów Androida i optymalizować wydajność gier na poziomie, który nie powoduje przegrzewania 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 nie do utrzymania.
  • Interfejs CPU Performance Hint API: udostępnia 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 nadawanie priorytetu wydajności lub żywotności baterii na podstawie ustawień użytkownika i konfiguracji specyficznych dla 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 efektywności energetycznej: informuje sesję, że wątki w sesji wskazówek dotyczących wydajności można bezpiecznie zaplanować tak, aby preferowały efektywność energetyczną zamiast wydajności. Dostępny w Androidzie 15 (poziom API 35).

Jak używać ADPF w natywnych projektach na Androida

Ćwiczenia z programowania Integrating Adaptability Features Into Your Native Game (Integracja funkcji dostosowywania z natywną grą) pomogą Ci zintegrować funkcje ADPF z grą. Możesz wykonywać kolejne kroki w dowolnym tempie. Po ukończeniu ćwiczeń z programowania zintegrujesz te funkcje:

  • Thermal API: monitoruj stan termiczny urządzenia i reaguj, zanim zacznie ono ograniczać wydajność z powodu przegrzania.
  • Interfejs Game Mode API: poznaj preferencje gracza dotyczące optymalizacji (maksymalna wydajność lub oszczędzanie baterii) i dostosuj do nich działanie aplikacji.
  • Game State API: informuje system o stanie gry (ładowanie, rozgrywka, interfejs itp.), dzięki czemu system może odpowiednio dostosować zasoby (zwiększyć liczbę operacji wejścia/wyjścia lub zasoby procesora, GPU itp.).
  • Performance Hint API: informuje system o modelu wątków i obciążeniu, aby mógł on odpowiednio przydzielać zasoby.

Jak używać ADPF w silniku gier Unity

Adaptive Performance od Unity to narzędzie dla deweloperów gier, którzy chcą zoptymalizować swoje gry na urządzenia mobilne, zwłaszcza w różnorodnym ekosystemie Androida. Adaptive Performance umożliwia dostosowywanie gry do wydajności i charakterystyki termicznej urządzenia w czasie rzeczywistym, co zapewnia płynną i wydajną rozgrywkę.

Dostawca ADPF na Androida prowadzi Cię przez proces wdrażania ADPF w Unity.

Okno Ustawienia projektu.
Rysunek 6. Zintegruj ADPF z silnikiem Unity.

Jak korzystać z ADPF w silniku gier Unreal

Okno Ustawienia projektu.
Rysunek 7. Zintegruj ADPF z Unreal Engine.
  1. Pobierz wtyczkę.
  2. Skopiuj wtyczkę do folderu wtyczek projektu.
  3. Włączanie wtyczki ADPF Unreal Engine w edytorze Unreal
  4. Ponowne uruchomienie edytora Unreal
  5. Skompiluj i przygotuj grę

Wtyczka Android Dynamic Performance Framework(ADPF) do Unreal Engine zapewnia stabilną wydajność i zapobiega ograniczeniu wydajności z powodu przegrzania. Pobierz wtyczkę z GitHuba. Ta wtyczka zmienia funkcje, ustawiając wartości konsoli Unreal.