Powolne sesje (tylko gry)

Powolne sesje to nowe dane Android Vitals w Konsoli Google Play. 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 od poprzedniej (odpowiednik 20 FPS). Android Vitals zgłasza też drugi zestaw danych o powolnych sesjach z docelową wartością 34 ms (co odpowiada 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 tej metryce znajdziesz w Centrum pomocy.

Grafika w postaci wykresu kołowego, która pokazuje liczbę spowolnionych i niespowolnionych klatek.
Rysunek 1. Powolna sesja w Android Vitals.

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

Polecenie Android dumpsys surfaceflinger timestats udostępnia średnią liczbę klatek na sekundę oraz histogram czasu present to present dla wszystkich renderowanych warstw. Czas obecności ramki to przedział między bieżącą a poprzednią ramką. Aby użyć polecenia do zbierania danych o FPS w grze, wykonaj te czynności:

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

    adb shell dumpsys SurfaceFlinger --timestats -clear -enable
    
  2. Gdy gra zostanie uruchomiona na tyle długo, aby zebrać wystarczającą ilość danych, uruchom ponownie polecenie z flagą dump, aby zapisać informacje:

    adb shell dumpsys SurfaceFlinger --timestats -dump
    

    Zrzut zawiera informacje o łącznej liczbie klatek i histogramie presentToPresent dla wszystkich warstw renderowanych przez SurfaceFlinger. Musisz znaleźć sekcję gry, filtrując według layerName:

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

    Niska liczba klatek sesji może zostać obliczona 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) / łączna liczba klatek × 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
    

    Średnia liczba klatek na sekundę dla każdego poziomu jest też widoczna w pliku dump:

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

    adb shell dumpsys SurfaceFlinger --timestats -disable
    

Przyczyny spowolnionego renderowania klatek i sposoby ich rozwiązania

Istnieje wiele powodów, dla których dany kadr może być wyświetlany na ekranie dłużej niż przewiduje to twórca. Gra może być ograniczona przez procesor lub kartę graficzną. Urządzenie przegrzewa się i aktywuje ograniczenie stanu termicznego. Może też występować niezgodność częstotliwości klatek gry z częstotliwością odświeżania ekranu urządzenia.

Aby rozwiązać te problemy i poprawić wydajność gry, użyj Android Frame Pacing (Swappy), VulkanaADPF.

Co to jest Swappy

Biblioteka do regulacji szybkości wyświetlania klatek na Androida, znana też jako Swappy, jest częścią bibliotek AGDK. Swappy pomaga uzyskać płynne renderowanie i poprawne tempo wyświetlania klatek w grach OpenGL i Vulkan na Androidzie.

Ustawianie częstotliwości wyświetlania klatek to synchronizacja logiki gry i pętli renderowania z podsystemem wyświetlania systemu operacyjnego oraz z podstawowym sprzętem wyświetlacza. Podsystem wyświetlania Androida został zaprojektowany tak, aby uniknąć artefaktów wizualnych (tzw. rozrywania obrazu), które mogą wystąpić, gdy sprzęt wyświetlania przełączy się na nową klatkę w trakcie aktualizacji. Aby uniknąć tych artefaktów, system wyświetlania:

  • buforuje poprzednie klatki wewnętrznie;
  • Wykrywanie spóźnionych przesyłek klatek
  • Powtarza wyświetlanie poprzednich klatek, gdy wykryto opóźnione klatki.

Dowiedz się, jak firma Mir 2 wykorzystała Swappy, aby zmniejszyć współczynnik wolnych sesji z 40% do 10%.

Jak używać Swappy w projektach natywnych

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

Jak używać Swappy w silniku gier Unity

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

Okno ustawień projektu.
Rysunek 2. Włącz ustawienie Frame Pacing w Unity Engine.

Możesz też włączyć w kodzie logicznym opcję Optimized Frame Pacing, aby Unity równomiernie rozprowadzało klatki, co zmniejszy zmienność liczby klatek na sekundę i ułatwi płynną rozgrywkę.

Jak używać Swappy w silniku gier Unreal

Unreal 4.25 i nowsze wersje integrują 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 Library i jak kontrolować tempo wyświetlania klatek za pomocą kodu C++.

Co to jest Vulkan

Vulkan to nowoczesny interfejs API do obsługi grafiki 3D na różnych platformach, który ma na celu zminimalizowanie abstrakcji między sprzętem do generowania grafiki na urządzeniu a grą. Vulkan jest podstawowym interfejsem API do obsługi grafiki na niższym poziomie na Androidzie i 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 poprawiające wydajność procesora
  • nowe funkcje graficzne niedostępne w OpenGL ES, takie jak interfejsy API bez bindowania i śledzenie promieniowe;

Jak używać Vulkana w natywnych projektach na Androida

W projekcie kodu Wprowadzenie do Vulkana na Androidzie znajdziesz instrukcje konfigurowania potoku renderowania Vulkana, a następnie renderowania obracającego się trójkąta z teksturą na ekranie. Skorzystaj z tego Codelab, aby dowiedzieć się, jak renderować grafikę gry.

Jak korzystać z Vulkana w silniku gier Unity

Aby włączyć automatyczny wybór urządzenia w Unity, wykonaj czynności konfiguracyjne interfejsu Auto Graphics API.

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

Możesz też włączyć Vulkana ręcznie, wyłączając Auto Graphics API i przypisując Vulkanowi najwyższy priorytet na liście interfejsów Graphics API. Jeśli używasz Unity 2021.1 lub starszej wersji, jest to jedyny sposób na korzystanie z Vulkana.

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

Użyj wtyczki do silnika Unity VkQuality, aby uzyskać rekomendacje interfejsu API grafiki do użycia w grze na określonych urządzeniach.

Jak korzystać z Vulkana w silniku Unreal

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

Okno ustawień projektu.
Rysunek 5. Włącz Vulkana 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. Aby dowiedzieć się, jak dostosować BaseDeviceProfile.ini, zapoznaj się z artykułem Właściwości i skalowalność profili urządzeń na urządzeniach z Androidem. Nowe sterowniki urządzeń mogą naprawić wcześniej znane złe urządzenia, dlatego aktualizuj plik BaseDeviceProfile.ini, aby korzystać ze wszystkich optymalizacji.

Co to jest ADPF

Dynamiczna platforma wydajnościowa Androida (ADPF) optymalizuje gry na podstawie dynamicznego zarządzania temperaturą, procesorem i procesorem graficznym w Androidzie. Funkcje te są przeznaczone głównie do gier, ale możesz ich używać też w przypadku innych aplikacji o wysokich wymaganiach dotyczących wydajności.

ADPF to zestaw interfejsów API, które umożliwiają aplikacjom i grom o wysokiej wydajności bezpośrednią interakcję z systemami zasilania i termicznymi urządzeń z Androidem. Dzięki tym interfejsom API możesz monitorować dynamiczne zachowanie na systemach Android i optymalizować wydajność gry na poziomie, który nie powoduje przegrzewania się urządzeń.

Oto główne funkcje ADPF:

  • Thermal API: monitoruje stan termiczny urządzenia, aby aplikacja mogła aktywnie dostosowywać obciążenie, zanim stanie się ono nie do przyjęcia.
  • Interfejs API wskazówek dotyczących wydajności procesora: dostarcza wskazówek dotyczących wydajności, które pozwalają Androidowi wybrać odpowiednie ustawienia wydajności (np. punkt operacyjny procesora lub rdzeń) dla obciążenia.
  • Game Mode API i Game State API: umożliwiają optymalizację rozgrywki poprzez nadawanie priorytetów wydajności lub żywotności baterii na podstawie ustawień użytkownika i konfiguracji gry.
  • Tryb stałej wydajności: podczas testowania porównawczego włącz tryb stałej wydajności na urządzeniu, aby uzyskać pomiary, które nie są zmieniane przez dynamiczne taktowanie procesora.
  • Tryb oszczędzania energii: informuje sesję, że wątki w sesji podpowiedzi dotyczącej wydajności mogą być bezpiecznie zaplanowane tak, aby preferować oszczędność energii zamiast wydajności. Dostępne w Androidzie 15 (poziom 35 interfejsu API).

Jak używać ADPF w natywnym projekcie na Androida

W ćwiczeniach z programowania Integracja funkcji adaptacyjnych w grze natywnej znajdziesz wskazówki dotyczące integracji funkcji adaptacyjnych w grze. Możesz je wykonywać we własnym tempie. Po zakończeniu modułu Codelab będziesz mieć zintegrowane te funkcje:

  • Thermal API: odczytuje stan termiczny urządzenia i zareaguje, zanim urządzenie przejdzie w stan ograniczenia termicznego.
  • Interfejs API trybu gry: poznaj preferencje optymalizacji dla graczy (maksymalizacja wydajności lub oszczędzanie baterii) i odpowiednio je dostosuj.
  • Game State API: informuje system o stanie gry (wczytywanie, rozgrywka, interfejs użytkownika itp.), dzięki czemu system może odpowiednio dostosować zasoby (przyspieszyć operacje wejścia/wyjścia lub procesor, procesor graficzny itp.).
  • Interfejs Performance Hint API: podaj systemowi informacje o modelu wątków i obciążeniu, aby mógł odpowiednio przydzielić zasoby.

Jak używać ADPF w silniku gier Unity

Adaptive Performance w Unity to narzędzie dla deweloperów gier, którzy chcą zoptymalizować swoje gry na urządzeniach mobilnych, w szczególności na potrzeby zróżnicowanego ekosystemu Androida. Tryb adaptacyjnej wydajności umożliwia grze dostosowanie się do wydajności i charakterystyk termicznych urządzenia w czasie rzeczywistym, co zapewnia płynną i wydajną rozgrywkę.

Dostawca adaptacyjnej wydajności na Androida przeprowadzi Cię przez proces implementacji ADPF w Unity.

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

Jak używać ADPF w silniku gier Unreal

Okno ustawień projektu.
Rysunek 7. Zintegruj ADPF w Unreal Engine.
  1. Pobierz wtyczkę.
  2. Skopiuj wtyczkę do folderu wtyczek projektu.
  3. Włączanie wtyczki ADPF Unreal Engine w edytorze Unreal
  4. Uruchom ponownie edytor Unreal Engine
  5. Tworzenie i testowanie gry

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