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).
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ę.
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.
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.
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.
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)
Zalecany tryb
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.
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.
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ę:
- Zintegruj funkcję Android Frame Pacing z mechanizmem renderowania OpenGL
- Integrowanie Android Frame Pacing z mechanizmem renderowania Vulkan