Powolne sesje (tylko gry)

Powolne sesje to nowe dane Android Vitals w Konsoli Google Play. Powolna sesja to sesja, w której ponad 25% klatek jest spowolnionych. Klatka jest spowolniona, jeśli zostanie wyświetlona w ciągu maksymalnie 50 ms od poprzedniej klatki (odpowiednik 20 kl./s). Android Vitals raportuje również drugą kategorię danych Powolne sesje, której wartość docelowa wynosi 34 ms (odpowiednik 30 kl./s). Za pomocą Powolnych sesji możesz poznać liczbę klatek w grze, która wpływa na 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 tylko po minucie gry.

Więcej informacji o tych danych znajdziesz w Centrum pomocy.

grafiki przypominające wykres kołowy, które pokazują liczbę spowolnionych i spowolnionych klatek;
Rysunek 1. Powolna sesja w Android Vitals.
.

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

Polecenie dumpsys surfaceflinger timestats na Androidzie pozwala podać średnią liczbę klatek na sekundę i prezentować histogram czasu dla wszystkich renderowanych warstw. Czas prezentowania ramki to odstęp między bieżącą klatką a poprzednią klatką. Aby zbierać dane o liczbie klatek na sekundę w grze, wykonaj te czynności:

  1. Uruchom polecenie z flagami enable i clear, aby rozpocząć przechwytywanie informacji:

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

    adb shell dumpsys SurfaceFlinger --timestats -dump
    

    Zbierane informacje obejmują łączną liczbę klatek i historię currentToPresent dla wszystkich warstw renderowanych przez SurfaceFlinger. Musisz znaleźć sekcję swojej gry, filtrując ją na podstawie atrybutu layerName:

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

    Powolną liczbę klatek w sesji można obliczyć na podstawie informacji o każdej warstwie.

    Na przykład odsetek spowolnionych klatek przy 20 FPS = (suma wartości od 54 do 1000 ms) / łączna liczba klatek 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świetla się też średnia liczba klatek na sekundę każdej warstwy:

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

    adb shell dumpsys SurfaceFlinger --timestats -disable
    

Przyczyny wolnego renderowania klatki i rozwiązania

Istnieje wiele powodów, dla których ramka może wyświetlać się na ekranie lub renderować się dłużej niż cel określony przez dewelopera. Gra może być powiązana z CPU/GPU. Możliwe też, że urządzenie przegrzewa się i aktywuje ograniczanie temperatury. lub niezgodność liczby klatek na sekundę w grze i częstotliwości odświeżania ekranu.

Aby rozwiązać te problemy i poprawić wydajność gry, użyj Android Frame Pacing, Vulkan i ADPF.

Co to jest Zamieńpy

Biblioteka Android Frame Pacing (znana również jako Zamieńpy) jest częścią bibliotek AGDK. Dzięki aplikacji otypy gry OpenGL i Vulkan na Androidzie są płynnie renderowane i mają odpowiednie tempo klatek.

Tempo renderowania klatki to synchronizacja pętli logicznej i renderowania gry z podsystemem wyświetlacza systemu operacyjnego i podsystemem sprzętowym wyświetlacza. Podsystem wyświetlaczy w Androidzie został zaprojektowany w taki sposób, aby uniknąć zakłóceń wizualnych (tzw. zrywania), które mogą wystąpić, gdy wyświetlacz przełączy się na nową ramkę w trakcie aktualizacji. Aby uniknąć tych artefaktów, podsystem wyświetlania:

  • Wewnętrznie buforuje wcześniejsze klatki
  • Wykrywa przesłane klatki po terminie
  • Powtarza wyświetlanie poprzednich klatek po wykryciu spóźnionych klatek

Jak używać narzędzia Zamieńpy w projektach natywnych

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

Jak używać Zamieńpy w silniku gry Unity

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

Okno ustawień projektu.
Rysunek 2. Włącz tempo klatek w Unity Engine.

Możesz też automatycznie włączyć w kodzie logicznym opcję Zoptymalizowane tempo renderowania klatek, aby umożliwić Unity równomierne rozdzielanie klatek w celu zmniejszenia liczby klatek i zapewnić płynną rozgrywkę.

Jak używać Zamieńpy w Unreal Game Engine

Unreal w wersji 4.25 lub nowszej integruje się z biblioteką Android Frame Pacing, która jest częścią Android Game Development Kit. Z artykułu Mobile Frame Pacing (Tempo wydawania klatek na komórki) dowiesz się, jak włączyć bibliotekę Androida Frame Pacing i jak sterować tempem klatek za pomocą kodu w języku C++.

Co to jest Vulkan

Vulkan to nowoczesny, wieloplatformowy interfejs API do grafiki 3D, który powstał z myślą o zminimalizowaniu abstrakcji pomiędzy sprzętem graficznym urządzenia a grą. Vulkan to podstawowy niskopoziomowy interfejs API do obsługi grafiki na Androidzie, który zastępuje OpenGL ES. OpenGL ES jest nadal obsługiwany na Androidzie, ale jego funkcje nie są już rozwijane.

Vulkan ma następujące zalety w porównaniu ze standardem OpenGL ES:

  • Bardziej wydajna architektura z niższym obciążeniem procesora w sterowniku karty graficznej
  • Nowe strategie optymalizacji mające na celu poprawę wydajności procesora
  • Nowe funkcje graficzne niedostępne w interfejsie OpenGL ES, takie jak bezwiązkowe interfejsy API czy śledzenie promieni

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

W ramach ćwiczenia z programowania Pierwsze kroki z Vulkan na Androidzie dowiesz się, jak skonfigurować potok renderowania Vulkan, a następnie wygenerować na ekranie teksturowany i obracający się trójkąt. Skorzystaj z ćwiczeń w Codelabs, aby dowiedzieć się, jak renderować grafikę w grze.

Jak używać interfejsu Vulkan w silniku gry Unity

Aby włączyć automatyczny wybór urządzeń w Unity, skonfiguruj interfejs Auto Graphics API.

Okno ustawień projektu.
Rysunek 3. Włącz interfejs Unity Auto Graphics API.

Możesz też ręcznie włączyć interfejs Vulkan, wyłączając Auto Graphics API i ustawiając Vulkan na najwyższym priorytecie na liście Graphics API. To jedyny sposób korzystania z platformy Unity 2021.1 lub jej poprzedniej wersji

Okno ustawień projektu.
Rysunek 4. Ręcznie wybierz Vulkan jako główny interfejs Graphics API w Unity.

Użyj wtyczki VkQuality Unity do silnika, aby udostępnić rekomendacje interfejsu Graphic API w czasie uruchomienia gry na konkretnych urządzeniach.

Jak używać Vulkan w Unreal Game Engine

Aby włączyć interfejs Vulkan Graphics API, otwórz Ustawienia projektu > Platformy > Android > Build i kliknij Support Vulkan (Pomoc techniczna Vulkan). Jeśli wybierzesz zarówno Obsługa Vulkana, jak i Obsługa OpenGL ES3.2, Unreal będzie domyślnie używać Vulkana. Jeśli urządzenie nie obsługuje interfejsu Vulkan, Unreal korzysta z OpenGL ES 3.2.

Okno ustawień projektu.
Rysunek 5. Włącz interfejs Vulkan w Unreal Engine.

Jeśli używasz określonych funkcji interfejsu Vulkan, które działają nieprawidłowo na określonych urządzeniach, możesz dostosować plik BaseDeviceProfile.ini, aby wykluczyć te urządzenia. Z artykułu Dostosowywanie profili urządzeń i skalowalności na Androidzie dowiesz się, jak dostosować BaseDeviceProfile.ini. Nowe sterowniki urządzeń mogą naprawić znane wcześniej nieprawidłowe urządzenia, dlatego aktualizuj plik BaseDeviceProfile.ini, aby korzystać z wszystkich optymalizacji.

Co to jest ADPF

Android Dynamic Performance Framework (ADPF) optymalizuje gry na podstawie dynamicznych funkcji zarządzania termią, procesorem i GPU na Androidzie. Skupiamy się na grach, ale funkcje te mogą się też przydać w innych aplikacjach wymagających dużej wydajności.

ADPF to zestaw interfejsów API, które umożliwiają grom i aplikacjom zapewniającym wysoką wydajność w bardziej bezpośredniej interakcji z systemami zasilania i termostatu urządzeń z Androidem. Za pomocą tych interfejsów API możesz monitorować dynamiczne zachowanie gier w systemach Android i optymalizować wydajność gier na zrównoważonym poziomie, który nie spowoduje przegrzania urządzeń.

Oto główne funkcje ADPF:

  • Thermal API: monitoruj stan termiczny urządzenia, aby aplikacja mogła aktywnie dostosować zbiór zadań, zanim stanie się niezrównoważony.
  • CPU Performance Hint API: podaj wskazówki dotyczące wydajności, które pozwalają Androidowi wybrać odpowiednie ustawienia wydajności (np. punkt operacyjny procesora lub rdzeń) do danego zadania.
  • Interfejs Game Mode API i Game State API: włącz optymalizację rozgrywek, nadając priorytet wydajności lub żywotności baterii na podstawie ustawień użytkownika i konfiguracji gry.
  • Stała wydajność: podczas testów porównawczych włącz tryb stałej wydajności na urządzeniu, aby uzyskać wyniki, które nie zmieniają się przez dynamiczne taktowanie procesora.
  • Tryb oszczędzania energii: informuje sesję, że wątki w sesji ze wskazówkami dotyczącymi wydajności można bezpiecznie zaplanować, aby preferować oszczędność energii zamiast wydajności. Dostępne w Androidzie 15 (API leve 35).

Jak używać ADPF w natywnych projektach Androida

Ćwiczenie z programowania dotyczące integrowania funkcji adaptacyjnych z grą natywną pomoże Ci zintegrować funkcje ADPF z grami za pomocą kroków, które możesz wykonywać w swoim własnym tempie. Na końcu tego ćwiczenia z programowania będziesz mieć dostęp do tych funkcji:

  • Thermal API: nasłuchuj zdarzeń termicznych urządzenia i reaguj, zanim urządzenie przejdzie w tryb ograniczania temperatury.
  • Game Mode API: pozwala poznać ustawienia optymalizacji odtwarzacza (zmaksymalizować wydajność lub oszczędzać baterię) i odpowiednio je dostosować.
  • Game State API: daj systemowi znać o stanie gry (wczytywanie, granie, UI itp.), a system może odpowiednio dostosowywać zasoby (wzmacniacz wejścia-wyjścia czy CPU, GPU itd.).
  • Performance Hint API: przekaż systemowi informacje o modelu wątków i zadaniu, aby mógł odpowiednio przydzielić zasoby.

Jak używać ADPF w silniku gier Unity

Funkcja adaptacyjna Unity to narzędzie dla deweloperów gier, którzy chcą zoptymalizować swoje gry na urządzeniach mobilnych, zwłaszcza pod kątem różnorodnego ekosystemu Androida. Wydajność adaptacyjna umożliwia grze dostosowanie się do wydajności i parametrów cieplnych urządzenia w czasie rzeczywistym, co zapewnia płynną i wydajną rozgrywkę.

Dostawca systemu Android Performance Max przeprowadzi Cię przez proces wdrażania ADPF w Unity.

Okno ustawień projektu.
Rysunek 6. Zintegruj ADPF z Unity Engine.

Jak używać ADPF w Unreal Game Engine

Okno ustawień projektu.
Rysunek 7. Zintegruj ADPF z unreal Engine.
  1. Pobierz wtyczkę
  2. Skopiuj wtyczkę do folderu wtyczki projektu
  3. Włącz wtyczkę ADPF Unreal Engine w edytorze Unreal
  4. Uruchom ponownie Nierealistyczny edytor
  5. Stwórz i ugotuj grę

Wtyczka Android Dynamic Performance Framework(ADPF) do Unreal Engine zapewnia stabilną wydajność i zapobiega ograniczaniu przepustowości. Pobierz wtyczkę z GitHuba. Ta wtyczka zmienia funkcje przez ustawienie Nierealistycznych wartości konsoli.