Tempo klatki

Biblioteka Android Frame Pacing, znana również jako Swappy, jest częścią pakietu SDK do gier na Androida . Pomaga grom OpenGL i Vulkan osiągnąć płynne renderowanie i prawidłowe tempo klatek na Androidzie.

Tempo klatek to synchronizacja logiki i pętli renderowania gry z podsystemem wyświetlania systemu operacyjnego i podstawowym sprzętem wyświetlającym. Podsystem wyświetlania Androida został zaprojektowany tak, aby uniknąć pewnych artefaktów wizualnych, takich jak łzawienie. Podsystem wyświetlacza zapobiega rozdarciu, wykonując następujące czynności:

  • Wewnętrzne buforowanie poprzednich klatek
  • Wykrywanie późnego przesyłania ramek
  • Kontynuowanie wyświetlania bieżącej klatki w przypadku wykrycia późnej klatki

Niespójne czasy wyświetlania klatek są spowodowane pętlą renderowania gry działającą z inną szybkością niż obsługiwana przez natywny sprzęt wyświetlający. Problemy pojawiają się, gdy pętla renderowania gry działa zbyt wolno dla używanego sprzętu wyświetlającego, co prowadzi do niespójnych czasów wyświetlania. Na przykład, gdy gra działająca z szybkością 30 klatek na sekundę próbuje renderować na urządzeniu, które natywnie obsługuje 60 klatek na sekundę, pętla renderowania gry powoduje, że powtarzająca się klatka pozostaje na ekranie przez dodatkowe 16 ms. Ten typ rozłączenia powoduje znaczne niespójności w czasach klatek, takich jak 33 ms, 16 ms, 49 ms i tak dalej. Zbyt złożone sceny dodatkowo pogłębiają ten problem, ponieważ powodują brakujące klatki.

Biblioteka Frame Pacing wykonuje następujące zadania:

  • Kompensuje zacinanie się spowodowane krótkimi klatkami gry.
  • Używa barier synchronizacji w przypadku długich klatek, które prowadzą do jąkania i opóźnień.
    • Wstrzykuje oczekiwania do aplikacji. Pozwalają one rurociągowi wyświetlającemu nadrobić zaległości, zamiast pozwalać na narastanie ciśnienia wstecznego.
    • Używa ogrodzeń synchronizacji ( EGL_KHR_fence_sync i VkFence ).
  • Wybiera częstotliwość odświeżania, aby zapewnić elastyczność i płynną prezentację, jeśli Twoje urządzenie obsługuje wiele częstotliwości odświeżania.
  • Zapewnia statystyki do debugowania i profilowania przy użyciu statystyk klatek .

Aby dowiedzieć się, jak skonfigurować bibliotekę do działania w różnych trybach, w zależności od potrzeb, zobacz Obsługiwane tryby pracy .

Aby zaimplementować użycie modułu renderującego OpenGL lub modułu renderującego Vulkan, zobacz

Aby dowiedzieć się więcej, zobacz Uzyskaj odpowiednią częstotliwość klatek .

Interwencja ograniczająca liczbę klatek na sekundę

Interwencja w zakresie ograniczania liczby klatek na sekundę (FPS) umożliwia uruchamianie gier z odpowiednią szybkością klatek na sekundę przy użyciu wyłącznie zmian po stronie platformy i bez konieczności podejmowania jakichkolwiek działań ze strony programistów.

Implementacja interwencji ograniczającej FPS wykorzystuje następujące komponenty:

Usługa GameManager

Komponent GameManagerService przechowuje wszystkie informacje dotyczące poszczególnych użytkowników i poszczególnych gier, dotyczące trybu gry i interwencji w grze. Informacje o liczbie klatek na sekundę są przechowywane w usłudze GameManagerService wraz z innymi informacjami interwencyjnymi, takimi jak współczynnik zmniejszania rozdzielczości, w mapowaniu <PACKAGE_NAME, Interventions> dla każdego profilu użytkownika. Dostęp do informacji o liczbie klatek na sekundę uzyskuje się po zmianie trybu gry lub aktualizacji interwencji. Identyfikator UID jest unikalny dla każdej PACKAGE_NAME i użytkownika i można go następnie przetłumaczyć na parę <UID, Frame Rate> w celu wysłania do SurfaceFlinger.

SurfaceFlinger

Komponent SurfaceFlinger obsługuje już ograniczanie liczby klatek na sekundę w aplikacji, o ile liczba klatek na sekundę jest dzielnikiem częstotliwości odświeżania wyświetlacza. W przypadku vsync SurfaceFlinger sprawdza ważność vsync dla aplikacji z ograniczeniami, sprawdzając, czy znacznik czasu vsync jest w fazie z liczbą klatek na sekundę aplikacji. Jeśli liczba klatek na sekundę nie jest w fazie z synchronizacją vsync, SurfaceFlinger wstrzymuje klatkę do czasu, aż liczba klatek na sekundę i synchronizacja vsync będą w fazie.

Poniższy rysunek opisuje interakcję pomiędzy usługą GameManagerService i SurfaceFlinger:

Interakcja pomiędzy usługą GameManagerService i SurfaceFlinger

Rysunek 1. Interakcja pomiędzy GameServiceManager i SurfaceFlinger

Urządzenie SurfaceFinger utrzymuje mapowanie par <UID, Frame Rate> , aby ustawić nowy priorytet ograniczania szybkości klatek. UID jest unikalny dla użytkowników i gier, dzięki czemu każdy użytkownik na jednym urządzeniu może mieć inne ustawienia liczby klatek na sekundę w tej samej grze. Aby ograniczyć liczbę klatek na sekundę w grze, GameServiceManager wywołuje SurfaceFlinger, aby zastąpić liczbę klatek na sekundę dla UID. Dzięki temu mechanizmowi SurfaceFlinger aktualizuje mapowanie za każdym razem, gdy zmieniany jest tryb gry lub aktualizacja interwencji. SurfaceFlinger obsługuje zmianę FPS, odpowiednio blokując bufory.

Aby dowiedzieć się więcej na temat ograniczania liczby klatek na sekundę, zobacz wprowadzenie do ograniczania liczby klatek na sekundę .