Tempo klatek

Biblioteka Android Frame Pacing, znana też jako Swappy, jest częścią Android Game SDK. Pomaga grom korzystającym z interfejsów OpenGLVulkan osiągać 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ć pewnych artefaktów wizualnych, takich jak rozrywanie obrazu. Podsystem wyświetlania zapobiega rozrywaniu obrazu, wykonując te czynności:

  • buforowanie poprzednich klatek wewnętrznie,
  • Wykrywanie spóźnionych przesłań klatek
  • Dalsze wyświetlanie bieżącej klatki po wykryciu opóźnionej klatki

Niespójne czasy wyświetlania klatek są spowodowane tym, że pętla renderowania gry działa z inną częstotliwością niż obsługiwana przez natywne urządzenie wyświetlające. Problemy pojawiają się, gdy pętla renderowania gry działa zbyt wolno w stosunku do sprzętu wyświetlającego, co prowadzi do niespójnych czasów wyświetlania. Jeśli na przykład gra działająca z częstotliwością 30 klatek na sekundę próbuje renderować obraz 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 rodzaj rozłączenia powoduje znaczne rozbieżności w czasach klatek, np. 33 ms, 16 ms i 49 ms. Zbyt złożone sceny dodatkowo pogarszają ten problem, ponieważ powodują pomijanie klatek.

Biblioteka Frame Pacing wykonuje te zadania:

  • Kompensuje przeskoki spowodowane krótkimi klatkami gry.
  • Używa barier synchronizacji w przypadku długich klatek, które prowadzą do przeskoków i opóźnień.
    • Wstawia w aplikacji oczekiwania. Pozwalają one potokowi wyświetlania nadążyć za zmianami, zamiast dopuszczać do wzrostu ciśnienia wstecznego.
    • Używa barier synchronizacji (EGL_KHR_fence_syncVkFence).
  • Wybiera częstotliwość odświeżania, aby zapewnić elastyczność i płynną prezentację, jeśli urządzenie obsługuje wiele częstotliwości odświeżania.
  • Udostępnia statystyki do debugowania i profilowania za pomocą statystyk klatek.

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

Aby wdrożyć renderowanie za pomocą OpenGL lub Vulkan, zapoznaj się z tymi artykułami:

Więcej informacji znajdziesz w artykule Biblioteka Frame Pacing.

Ograniczanie liczby klatek na sekundę

Ograniczanie liczby klatek na sekundę (FPS) umożliwia dostosowanie liczby FPS w grach do odpowiedniego poziomu za pomocą zmian po stronie platformy i bez konieczności podejmowania jakichkolwiek działań przez deweloperów.

Wdrożenie interwencji ograniczającej liczbę klatek na sekundę wykorzystuje te komponenty:

GameManagerService

Komponent GameManagerService przechowuje wszystkie informacje o trybie gry i interwencji w grze dotyczące poszczególnych użytkowników i gier. Informacje o klatkach na sekundę są przechowywane w usłudze GameManagerService wraz z innymi informacjami o interwencjach, takimi jak współczynnik zmniejszenia rozdzielczości, w <PACKAGE_NAME, Interventions>mapowaniu dla każdego profilu użytkownika. Informacje o FPS są dostępne, gdy zmieniany jest tryb gry lub aktualizowana jest interwencja. UID jest unikalny dla każdego PACKAGE_NAME i użytkownika, a dodatkowo można go przetłumaczyć na parę <UID, Frame Rate>, aby wysłać do SurfaceFlingera.

SurfaceFlinger

Komponent SurfaceFlinger obsługuje już ograniczanie liczby klatek na sekundę w aplikacji, o ile liczba klatek jest dzielnikiem częstotliwości odświeżania wyświetlacza. W przypadku synchronizacji pionowej SurfaceFlinger sprawdza, czy jest ona prawidłowa dla aplikacji z ograniczoną liczbą klatek, weryfikując, czy sygnatura czasowa synchronizacji pionowej jest zgodna z liczbą klatek na sekundę aplikacji. Jeśli liczba klatek na sekundę nie jest zsynchronizowana z VSync, SurfaceFlinger wstrzymuje klatkę, dopóki liczba klatek na sekundę i VSync nie zostaną zsynchronizowane.

Na poniższym rysunku przedstawiono interakcję między usługą GameManagerService a usługą SurfaceFlinger:

Interakcja między usługą GameManagerService a SurfaceFlinger

Rysunek 1. Interakcja między GameServiceManager a SurfaceFlinger.

Interfejs SurfaceFinger utrzymuje <UID, Frame Rate> parę mapowań, aby ustawić nowy priorytet ograniczania liczby klatek na sekundę. Wartość UID jest unikalna dla użytkowników i gier, dzięki czemu każdy użytkownik na jednym urządzeniu może mieć różne ustawienia liczby klatek w tej samej grze. Aby ograniczyć liczbę klatek w grze, usługa GameManagerService wywołuje SurfaceFlinger, aby zastąpić liczbę klatek dla identyfikatora UID. Dzięki temu mechanizmowi SurfaceFlinger aktualizuje mapowanie za każdym razem, gdy zmienia się tryb gry lub interwencja. Usługa SurfaceFlinger obsługuje zmianę liczby klatek na sekundę, odpowiednio blokując bufory.

Więcej informacji o ograniczaniu liczby klatek na sekundę znajdziesz w sekcji Ograniczanie liczby klatek na sekundę.