Tempo klatek

Biblioteka Android Frame Pacing, znana też jako Swappy, jest częścią pakietu SDK do gier na Androida. Umożliwia to płynne renderowanie i prawidłowe tempo klatek w grach na Androida korzystających z interfejsów OpenGLVulkan.

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 powtórzona 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 zacinanie się spowodowane krótkimi klatkami gry.
  • Używa barier synchronizacji w przypadku długich klatek, które powodują zacinanie się i opóźnienia.
    • 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 za pomocą zmian po stronie platformy bez konieczności podejmowania jakichkolwiek działań przez deweloperów.

Wdrożenie ograniczenia liczby 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 FPS 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 klatkach na sekundę 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 przekształcić w 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 usługą SurfaceFlinger

Rysunek 1. Interakcja między GameServiceManager a SurfaceFlinger.

Interfejs SurfaceFinger utrzymuje mapowanie <UID, Frame Rate>, aby ustawić nowy priorytet ograniczania liczby klatek na sekundę. Wartość UID jest unikalna dla każdego użytkownika i gry, 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 GameServiceManager wywołuje usługę 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 jest aktualizowana. SurfaceFlinger obsługuje zmianę liczby klatek na sekundę, odpowiednio blokując bufory.

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