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.
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:
Aby rozpocząć rejestrowanie informacji, uruchom polecenie z flagami
enableiclear:adb shell dumpsys SurfaceFlinger --timestats -clear -enableGdy gra będzie działać wystarczająco długo, ponownie uruchom polecenie z flagą
dump, aby zrzucić informacje:adb shell dumpsys SurfaceFlinger --timestats -dumpZrzut 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)#132833Niska 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=0W zrzucie wyświetlana jest też średnia liczba klatek na sekundę każdej warstwy:
... averageFPS = 30.179 ...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), Vulkan i ADPF.
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:
- Integrowanie funkcji Android Frame Pacing z renderowaniem OpenGL
- Integracja funkcji Android Frame Pacing z renderowaniem Vulkan
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:
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.
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.
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.
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.
Jak korzystać z ADPF w silniku gier Unreal
- Pobierz wtyczkę.
- Skopiuj wtyczkę do folderu wtyczek projektu.
- Włączanie wtyczki ADPF Unreal Engine w edytorze Unreal
- Ponowne uruchomienie edytora Unreal
- 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.