Biblioteka Frame Pacing Zawiera Android Game Development Kit.

Biblioteka Android Frame Pacing (znana też jako Zamieńpy) jest częścią bibliotek AGDK. Umożliwia on grom OpenGL i Vulkan płynne renderowanie wybierz właściwą szybkość klatek na sekundę. Ten dokument określa tempo wyświetlania klatek, w sytuacjach, w których jest potrzebne tempo wyświetlania klatek, i pokazuje, jak radzi sobie o takich sytuacjach. Jeśli chcesz od razu przejść do implementacji tempa klatek przejdź do sekcji Następny krok.

Tło

Tempo renderowania klatki to synchronizacja pętli logicznej gry i pętli renderowania z parametrem i podsystem do wyświetlania reklam w systemie operacyjnym. Android podsystem do wyświetlania reklam został zaprojektowany w taki sposób, aby unikać zakłóceń wizualnych (tzw. znikanie). który może wystąpić, gdy wyświetlacz przełączy się częściowo na nową ramkę. w ramach aktualizacji. Aby uniknąć tych artefaktów, podsystem do wyświetlania :

  • Wewnętrznie buforuje wcześniejsze klatki
  • Wykrywa przesłane klatki po terminie
  • Powtarza wyświetlanie poprzednich klatek po wykryciu spóźnionych klatek

Gra informuje SurfaceFlinger, kompozytora w podsystemie wyświetlania, że przesłał on wszystkie elementy wymaganych żądań dla klatki (wywołaniem eglSwapBuffers lub vkQueuePresentKHR). SurfaceFlinger sygnalizuje dostępność ramki na wyświetlaczu za pomocą zatrzask. Na wyświetlaczu pojawi się wtedy dana klatka. Ekran jest tykane ze stałą częstotliwością, np. 60 Hz i gdy nie ma nowej klatki, jeśli sprzęt go potrzebuje, urządzenie ponownie wyświetli poprzednią klatkę.

Niespójne czasy renderowania klatek występują często, gdy pętla renderowania gry jest renderowana niż w przypadku natywnego sprzętu do wyświetlania reklam. Jeśli gra działa z szybkością 30 kl./s próbuje renderować grę na urządzeniu, które natywnie obsługuje 60 FPS, pętla nie zdaje sobie sprawy, że powtarzająca się klatka pozostaje na ekranie przez dodatkowe 16 milisekund. Takie rozłączenie zwykle powoduje znaczną niespójność w kadrze. np. 49 milisekund, 16 milisekund, 33 milisekundy. Zbyt dużo złożone sceny pogłębiają ten problem, ponieważ powodują wystąpienia.

Rozwiązania nieoptymalne

Poniższe rozwiązania do tempa wyświetlania klatek były stosowane w przeszłości w grach co zwykle skutkuje niespójnymi czasami klatek i większym opóźnieniem sygnału wejściowego.

Przesyłaj ramki tak szybko, jak pozwala na to interfejs API renderowania

Ta metoda łączy grę ze zmienną aktywnością SurfaceFlinger i przedstawia z dodatkową klatką opóźnienia. Potok wyświetlania zawiera kolejkę ramek, zwykle o rozmiarze 2, który zapełnia się, gdy gra również próbuje wyświetlać klatki. szybko. W kolejce brakuje miejsca, wątek renderowania) jest blokowany przez wywołanie OpenGL lub Vulkan. Pora na grę musiał czekać na pojawienie się ramki na ekranie. synchronizuje te 2 komponenty. Jest to tzw. upychanie buforowe lub upychanie koleją. Proces renderowania nie wie, co się dzieje, więc niespójność liczby klatek się pogarsza. Jeśli próbek gier przed klatką, opóźnienie sygnału wejściowego się pogarsza.

Używanie aplikacji Choreographer na Androida

Gry korzystają też z usługi Android Choreographer do synchronizacji. Ten komponent dostępne w języku Java od interfejsu API 16 i w C++ od interfejsu API 24, udostępnia regularne znaczniki z taką samą częstotliwością jak w podsystemie sieci reklamowej. Istnieją pewne subtelności, gdy ten wskaźnik zostanie dostarczony względem rzeczywistego sprzętu VSYNC i te wartości przesunięcia różnią się w zależności od urządzenia. W przypadku długich klatek może występować upychanie z bufora.

Zalety biblioteki Frame Pacing

Biblioteka Frame Pacing korzysta z narzędzia Android Choreographer, które pozwala zsynchronizować radzi sobie z zmiennością częstotliwości wyświetlania znaczników. Wykorzystuje prezentację Dzięki sygnaturom czasowym klatki są wyświetlane we właściwym czasie i synchronizacja płodów aby uniknąć upychania buforów. Biblioteka korzysta z choreografa NDK, jeśli jest dostępny wraca do Correografa Java, jeśli w rzeczywistości – nie.

Biblioteka obsługuje wiele częstotliwości odświeżania, jeśli urządzenie je obsługuje, co daje grze większą elastyczność w prezentowaniu ramki. Na przykład w przypadku adresu które obsługuje częstotliwość odświeżania 60 Hz i 90 Hz (czyli grę, która nie produkcja 60 klatek na sekundę może zmniejszyć prędkość do 45 FPS zamiast 30 płynne. Biblioteka wykrywa oczekiwaną liczbę klatek w grze i automatycznie dostosowuje klatkę odpowiednio dostosować czas prezentacji. Biblioteka Frame Pacing zwiększa też żywotność baterii ponieważ pozwala uniknąć niepotrzebnych aktualizacji wyświetlacza. Jeśli na przykład gra jest renderowanie z szybkością 60 FPS, ale wyświetlacz aktualizuje się z częstotliwością 120 Hz, aktualizowane dwukrotnie dla każdej klatki. Biblioteka Frame Pacing to unika, ustawiając częstotliwość odświeżania do wartości obsługiwanej przez urządzenie najbliższe wartości docelowej liczby klatek na sekundę.

Jak to działa

W kolejnych sekcjach zobaczysz, jak biblioteka Frame Pacing radzi sobie z długimi klatek kluczowych w celu uzyskania prawidłowego tempa.

Właściwe tempo klatek przy 30 Hz

W przypadku renderowania z częstotliwością 30 Hz na urządzeniu z częstotliwością 60 Hz idealna sytuacja na Androidzie: co pokazano na ilustracji 1. SurfaceFlinger wczytuje nowe bufory graficzne, jeśli są dostępne (NB diagram wskazuje „brak bufora” obecny i poprzednia wartość się powtarza).

Idealne tempo odświeżania przy 30 Hz na urządzeniu 60 Hz

Rysunek 1. Idealne tempo odświeżania przy 30 Hz na urządzeniu 60 Hz

Krótkie klatki w grze powodują zacinanie się

Na większości współczesnych urządzeń silniki gier opierają się na pracy choreografa platformy i dostarczania klatek, aby napędzać przesyłanie klatek. Nadal jednak istnieje ryzyko niskiej tempa klatki ze względu na krótkie klatki, co widać na rysunku 2. Odtwarzacz postrzega krótkie klatki, po których występują długie, zacinanie się.

Krótkie ramki do gier

Rysunek 2. Krótka klatka C w grze powoduje, że w ramce B wyświetla się tylko jedna klatka, po których następuje kilka klatek C

Biblioteka Frame Pacing rozwiązuje ten problem dzięki wykorzystaniu sygnatur czasowych prezentacji. biblioteka korzysta z rozszerzeń sygnatury czasowej prezentacji EGL_ANDROID_presentation_time oraz VK_GOOGLE_display_timing aby klatki nie były prezentowane wcześniej, jak widać na rysunku 3.

sygnatury czasowe prezentacji;

Rysunek 3. Ramka B wyświetlana dwukrotnie, aby zapewnić płynniejszy obraz

Długie klatki powodują zacinanie się i opóźnienia

Gdy zadanie wyświetlania trwa dłużej niż zadanie aplikacji, dodatkowe ramki zostaną dodane do kolejki. Ponownie prowadzi to do zacinania się, a także może powoduje wydłużenie czasu oczekiwania z powodu „upychania buforów” (zobacz ilustrację 4). eliminuje zacinania i dodatkową klatkę opóźnienia.

Długie ramki do gry

Rysunek 4. Długa klatka B ma nieprawidłowe tempo dla 2 klatek – A i B

Biblioteka rozwiązuje ten problem, stosując zabezpieczenia synchronizacji (EGL_KHR_fence_sync oraz VkFence) wstrzykiwanie czekania do aplikacji, które pozwalają potokowi wyświetlania na wychwycenie zamiast pozwolić na zwiększenie presji. Ramka A nadal przedstawia ale ramka B jest wyświetlana prawidłowo, jak widać na grafice 5.

Oczekiwania dodane do warstwy aplikacji

Rysunek 5. Klatki C i D czekają na wyświetlenie

Obsługiwane tryby działania

Bibliotekę Frame Pacing możesz skonfigurować tak, by działała w jednej z trzech następujące tryby:

  • Tryb automatyczny wyłączony + potok
  • Tryb automatyczny włączony + potok
  • Tryb automatyczny włączony + tryb automatycznego potoku (potok/potok poza potokiem)

Możesz eksperymentować z trybami automatycznego i potoku, ale najpierw musisz włączyć je wyłączyć i dodać po zainicjowaniu programu Replacepy:

  swappyAutoSwapInterval(false);
  swappyAutoPipelineMode(false);
  swappyEnableStats(false);
  swappySwapIntervalNS(1000000000L/yourPreferredFrameRateInHz);

Tryb potoku

Do koordynowania zadań silnika biblioteka zwykle używa modelu potoku który rozdziela zbiory zadań procesora i GPU przez granice VSYNC.

Tryb potoku

Rysunek 6. Tryb potoku

Tryb inny niż potok

Ogólnie w tym przypadku ekran wprowadzania danych jest mniej przewidywalny i mniejszy. opóźnienia. W przypadkach, gdy gra ma bardzo krótki czas renderowania klatek, zarówno CPU, jak i GPU zadania mogą mieścić się w przedziale jednej wymiany. W tym przypadku jest to funkcja bez potoku pozwala skrócić czas oczekiwania na ekran wejściowy.

Tryb inny niż potok

Rysunek 7. Tryb inny niż potok

Tryb automatyczny

Większość gier nie wie, jak wybrać interwał wymiany, który jest wyświetlana jest każda klatka (np.33, 3 ms przy 30 Hz). Na niektórych urządzeniach gra może renderować się z szybkością 60 FPS, a na innej – spadek może być niższy . Tryb automatyczny mierzy czasy pracy procesora i GPU, aby:

  • Automatycznie wybierz interwały wymiany: gry, które w niektórych przypadkach oferują częstotliwość 30 Hz scen i 60 Hz w innych, umożliwi to bibliotece dostosowanie tego interwału. dynamicznie.
  • Wyłączanie potoku w przypadku ultraszybkich klatek: zapewnia optymalną opóźnienia ekranu wejściowego we wszystkich przypadkach.

Wiele częstotliwości odświeżania

Urządzenia, które obsługują wiele częstotliwości odświeżania, zapewniają większą elastyczność wybierając interwał wymiany, który wygląda płynnie:

  • Na urządzeniach z częstotliwością odświeżania 60 Hz: 60 FPS / 30 FPS / 20 FPS
  • Na urządzeniach 60 Hz + 90 Hz: 90 FPS / 60 FPS / 45 FPS / 30 FPS
  • Na urządzeniach 60 Hz + 90 + 120 Hz: 120 FPS / 90 FPS / 60 FPS / 45 FPS / 40 kl./s / 30 kl./s

Biblioteka wybiera częstotliwość odświeżania, która najlepiej pasuje do rzeczywistego renderowania. do długości klatek, co zapewnia lepsze wrażenia wizualne.

Więcej informacji o częstotliwości odświeżania klatek znajdziesz w Renderowanie z wysoką częstotliwością odświeżania na Androidzie .

Statystyki klatek

Biblioteka Frame Pacing oferuje poniższe statystyki do debugowania cele profilowania:

  • Histogram przedstawiający liczbę odświeżeń ekranu w klatce oczekującej w kolejce kompozytora po zakończeniu renderowania.
  • Histogram przedstawiający liczbę odświeżeń ekranu, które przeszły między żądaniami czas prezentacji i bieżącą godzinę teraźniejszości.
  • Histogram przedstawiający liczbę odświeżeń ekranu między 2 kolejnymi liczbami ramki.
  • Histogram pokazujący liczbę odświeżeń ekranu, które miały miejsce między rozpoczęciem Procesor działa dla tej klatki i dla rzeczywistego czasu bieżącego.

Następny krok

Zapoznaj się z jednym z tych przewodników, aby zintegrować bibliotekę Android Frame Pacing w grę:

.