Tempo klatek

Biblioteka Android Frame Pacing, znana też jako Swappy, jest częścią pakietu Android Game SDK. Pomaga to grom w OpenGLVulkanie płynnie renderować i prawidłowo dobierać tempo wyświetlania klatek na Androidzie.

Synchronizacja klatek to synchronizacja logiki i pętli renderowania z podsystemem wyświetlania systemu operacyjnego oraz z podstawowym sprzętem wyświetlania. Podsystem wyświetlania Androida został zaprojektowany tak, aby unikać pewnych artefaktów wizualnych, takich jak rozrywanie obrazu. Podsystem wyświetlania zapobiega rozdarciom, wykonując te czynności:

  • buforowanie poprzednich klatek wewnętrznie,
  • Wykrywanie spóźnionych przesyłek klatek
  • wyświetlanie bieżącej klatki, gdy wykryto klatkę opóźnioną;

Niespójne czasy wyświetlania klatek są spowodowane tym, że pętla renderowania gry działa z inną częstotliwością niż obsługuje sprzęt wyświetlacza. Problemy pojawiają się, gdy pętla renderowania gry działa zbyt wolno w stosunku do podrzędnego sprzętu wyświetlacza, co prowadzi do niespójności w czasie wyświetlania. Jeśli na przykład gra działająca z szybkością 30 fps próbuje renderować na urządzeniu, które obsługuje 60 fps, pętla renderowania gry powoduje, że powtórzony obraz pozostaje na ekranie przez dodatkowe 16 ms. Ten typ rozłączenia powoduje znaczne niespójności w czasie wyświetlania klatek, np. 33 ms, 16 ms i 49 ms. Nadmiernie skomplikowane sceny pogłębiają ten problem, ponieważ powodują pominięcie klatek.

Biblioteka Frame Pacing wykonuje te zadania:

  • Wyrównuje zacięcia spowodowane krótkimi klatkami w grze.
  • Używa barierek synchronizacji w przypadku długich klatek, które powodują zacinanie i opóźnienia.
    • Wstrzykuje opóźnienia do aplikacji. Pozwala to łańcuchowi wyświetlania nadrobić zaległości, zamiast dopuścić do wzrostu ciśnienia wstecznego.
    • Używa zabezpieczeń synchronizacji (EGL_KHR_fence_syncVkFence).
  • Wybiera częstotliwość odświeżania, aby zapewnić elastyczność i płynność prezentacji, jeśli urządzenie obsługuje różne 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 artykułem Obsługiwane tryby działania.

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

Więcej informacji znajdziesz w bibliotece Frame Pacing.

Interwencja polegająca na ograniczeniu liczby klatek na sekundę

Interwencja polegająca na ograniczeniu liczby klatek na sekundę (FPS) umożliwia prowadzenie rozgrywki z odpowiednią liczbą FPS tylko za pomocą zmian po stronie platformy i bez konieczności podejmowania żadnych działań przez deweloperów.

Wdrożenie interwencji polegającej na ograniczeniu liczby klatek na sekundę wykorzystuje te komponenty.

GameManagerService

Komponent GameManagerService przechowuje wszystkie informacje o użytkownikach i grach dotyczące trybu gry oraz interwencji w grze. Informacje o FPS są przechowywane w GameManagerService wraz z innymi informacjami o interwencji, takimi jak współczynnik zmniejszania rozdzielczości, w mapowaniu <PACKAGE_NAME, Interventions> dla każdego profilu użytkownika. Informacje o FPS są dostępne po zmianie trybu gry lub aktualizacji interwencji. UID jest unikalny dla każdego PACKAGE_NAME i użytkownika. 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ę aplikacji, o ile liczba klatek jest dzielnikiem częstotliwości odświeżania wyświetlacza. W przypadku synchronizacji pionowej SurfaceFlinger sprawdza jej ważność w przypadku aplikacji z ograniczoną wydajnością, sprawdzając, czy sygnatura czasowa synchronizacji pionowej jest zsynchronizowana z częstotliwością klatek aplikacji. Jeśli częstotliwość klatek nie jest zsynchronizowana z VSync, SurfaceFlinger zatrzymuje ramkę, dopóki częstotliwość klatek i VSync nie zostaną zsynchronizowane.

Na rysunku poniżej przedstawiono interakcję usługi GameManagerService z usługą SurfaceFlinger:

Interakcja między usługą GameManagerService a SurfaceFlinger

Rysunek 1. Interakcja między GameServiceManager a SurfaceFlinger.

Interfejs SurfaceFinger zachowuje parę mapowania <UID, Frame Rate>, aby ustawić nowy priorytet ograniczania liczby klatek na sekundę. UID jest unikalny dla poszczególnych użytkowników i gier, dzięki czemu każdy użytkownik na jednym urządzeniu może mieć inne ustawienia częstotliwości klatek w tej samej grze. Aby ograniczyć liczbę klatek na sekundę w grze, GameServiceManager wywołuje SurfaceFlinger, aby zastąpić liczbę klatek na sekundę w UID. Dzięki temu mechanizmowi SurfaceFlinger aktualizuje mapowanie za każdym razem, gdy zmienia się tryb gry lub interwencja. Komponent SurfaceFlinger obsługuje zmianę liczby klatek na sekundę, odpowiednio przełączając bufory.

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