Interfejs API liczby klatek pozwala aplikacjom na informowanie platformy Androida o zamierzonej klatki. tych urządzeń i jest dostępne w aplikacjach kierowanych na Androida 11 (poziom interfejsu API 30) lub nowszego. Zazwyczaj większość urządzeń obsługuje tylko jedną częstotliwość odświeżania zwykle 60 Hz, ale to się zmieniło. Wiele urządzeń obsługuje teraz dodatkowe Częstotliwość odświeżania, np. 90 Hz lub 120 Hz. Niektóre urządzenia obsługują płynną częstotliwość odświeżania przełączniki, podczas gdy inne na chwilę pokazują czarny ekran, zwykle trwający sekundę.
Głównym celem interfejsu API jest umożliwienie aplikacjom lepszego wykorzystywania wszystkich
obsługiwane częstotliwości odświeżania. Na przykład aplikacja odtwarza film w częstotliwości 24 Hz
jeśli dzwoni pod numer setFrameRate()
, może to spowodować zmianę wyświetlacza przez urządzenie
częstotliwość odświeżania od 60 Hz do 120 Hz. Ta nowa częstotliwość odświeżania zapewnia
płynne odtwarzanie filmów w częstotliwości 24 Hz bez przewijania menu 3:2.
wymaganych do odtwarzania tego samego filmu na wyświetlaczu 60 Hz. Dzięki temu użytkownicy
i uzyskiwanie dodatkowych informacji.
Podstawowe wykorzystanie
Android udostępnia kilka sposobów dostępu do platform i sterowania nimi, dlatego
kilka wersji interfejsu API setFrameRate()
. Każda wersja interfejsu API przyjmuje
te same parametry i działa tak samo jak inne:
Surface.setFrameRate()
SurfaceControl.Transaction.setFrameRate()
ANativeWindow_setFrameRate()
ASurfaceTransaction_setFrameRate()
Aplikacja nie musi uwzględniać rzeczywistej obsługiwanych częstotliwości odświeżania
które można uzyskać, wywołując
Display.getSupportedModes()
aby bezpiecznie zadzwonić do: setFrameRate()
. Na przykład, nawet jeśli urządzenie
obsługuje częstotliwość 60 Hz, wywołaj setFrameRate()
z preferowaną liczbą klatek na sekundę.
Urządzenia, które nie mają lepszego dopasowania do liczby klatek w aplikacji, pozostaną na
bieżącej częstotliwości odświeżania ekranu.
Aby sprawdzić, czy wywołanie setFrameRate()
powoduje zmianę odświeżania wyświetlacza
stopa, zarejestruj się na powiadomienia o zmianie wyświetlacza, dzwoniąc
DisplayManager.registerDisplayListener()
.
lub AChoreographer_registerRefreshRateCallback()
.
Przy wywołaniu funkcji setFrameRate()
najlepiej jest podać dokładną liczbę klatek,
niż zaokrąglenia do liczby całkowitej. Na przykład podczas renderowania filmu nagranego
29,97 Hz, przekazuj 29,97 Hz zamiast zaokrąglania do 30.
W przypadku aplikacji wideo należy ustawić parametr zgodności przekazywany do funkcji setFrameRate()
do: Surface.FRAME_RATE_COMPATIBILITY_FIXED_SOURCE
, aby uzyskać dodatkową wskazówkę dla
platformy Android, której aplikacja będzie używać menu rozwijanego, aby dostosować
częstotliwość odświeżania wyświetlacza (co będzie powodować szum).
W niektórych przypadkach okno filmu przestanie przesyłać klatki, ale nie znikną.
widoczne na ekranie przez pewien czas. Typowe scenariusze to m.in. odtwarzanie
dotrze do końca filmu lub gdy użytkownik wstrzyma odtwarzanie. W takich przypadkach
wywołaj funkcję setFrameRate()
z parametrem liczby klatek ustawionym na 0, aby wyczyścić
z przywróceniem wartości domyślnej. Czyszczenie ustawienia liczby klatek
nie jest konieczne przy niszczeniu powierzchni lub gdy jest ona
jest ukryta, ponieważ użytkownik przełączył się na inną aplikację. Wyczyść liczbę klatek
można ustawić tylko wtedy, gdy powierzchnia pozostaje widoczna, ale nie jest używana.
Niepłynny przełącznik liczby klatek
Na niektórych urządzeniach przełączanie częstotliwości odświeżania może powodować zakłócenia wizualne, np. czarny ekran
przez sekundę lub dwa. Zwykle dzieje się tak na dekoderach, panelach TV,
i podobnych urządzeniach. Domyślnie platforma Androida nie przełącza trybów.
gdy Surface.setFrameRate()
Interfejs API jest wywoływany, aby uniknąć takich przerw w działaniu usługi.
Niektórzy użytkownicy wolą na początku wizualną przerwę, na końcu dłuższych filmów. Dzięki temu częstotliwość odświeżania wyświetlacza jest taka sama liczbę klatek na sekundę i unikać zakłóceń związanych z liczbą klatek na sekundę, takich jak 3:2. suwak odtwarzania filmu.
Dlatego niepłynne przełączniki częstotliwości odświeżania można włączyć, jeśli zgody użytkownika i aplikacji:
- Użytkownicy: aby włączyć tę opcję, użytkownicy mogą włączyć ustawienie Dopasowanie liczby klatek na sekundę. .
- Aplikacje: aby włączyć tę opcję, aplikacje mogą przekazywać
CHANGE_FRAME_RATE_ALWAYS
. wsetFrameRate()
.
Zalecamy zawsze używać CHANGE_FRAME_RATE_ALWAYS
w przypadku długotrwałych filmów, takich jak filmy. Wynika to z korzyści płynących z dopasowania
liczba klatek na sekundę jest ważniejsza niż przerwa w działaniu filmu po zmianie
częstotliwość odświeżania.
Dodatkowe zalecenia
Postępuj zgodnie z tymi zaleceniami w typowych scenariuszach.
Wiele platform
Platforma Android została zaprojektowana tak, aby poprawnie obsługiwać sytuacje,
na wielu platformach z różnymi ustawieniami liczby klatek. Gdy aplikacja ma wiele
na platformach o różnych liczbach klatek na sekundę, wywołaj funkcję setFrameRate()
z właściwym
z liczbą klatek na sekundę
z każdej platformy. Nawet jeśli na urządzeniu jest uruchomionych wiele aplikacji
raz, za pomocą podzielonego ekranu lub trybu obrazu w obrazie, każda aplikacja może bezpiecznie połączyć
setFrameRate()
na ich własnych platformach.
Platforma nie zmienia liczby klatek w aplikacji.
Nawet jeśli urządzenie obsługuje liczbę klatek określoną przez aplikację w wywołaniu.
setFrameRate()
, w niektórych przypadkach urządzenie nie przełącza się na
z taką częstotliwością odświeżania. Na przykład platforma o wyższym priorytecie może mieć inny
liczby klatek lub urządzenie może być w trybie oszczędzania baterii (ustawienie
ograniczenie częstotliwości odświeżania ekranu w celu oszczędzania baterii). Aplikacja musi nadal
działa poprawnie, gdy urządzenie nie przełącza częstotliwości odświeżania ekranu
ustawienia liczby klatek w aplikacji, nawet jeśli urządzenie przełączy się w normalny sposób.
okoliczności.
To aplikacja decyduje, jak zareagować na częstotliwość odświeżania ekranu
nie pasuje do liczby klatek w aplikacji. W filmach liczba klatek jest stała
Film źródłowy i trzeba rozwijana musi być lista rozwijana. O
może zamiast tego spróbować uruchomić ją z częstotliwością odświeżania ekranu
z preferowaną liczbą klatek. Aplikacja nie powinna zmieniać wartości, którą otrzymuje
przekazuje do setFrameRate()
na podstawie tego, co robi platforma. Powinien pozostać ustawiony
do preferowanej liczby klatek niezależnie od sposobu
platforma nie dostosowuje się do żądania aplikacji. Dzięki temu, jeśli urządzenie
warunki zmieniają się, aby umożliwić zastosowanie dodatkowych częstotliwości odświeżania,
platforma ma prawidłowe informacje umożliwiające przełączenie się na preferowaną ramkę aplikacji
stawki.
Jeśli aplikacja nie działa lub nie może działać z częstotliwością odświeżania ekranu, powinny określić sygnatury czasowe prezentacji dla każdej klatki, korzystając z jednego z mechanizmy platformy służące do ustawiania sygnatur czasowych prezentacji:
Użycie tych sygnatur czasowych uniemożliwia platformie wyświetlanie ramki aplikacji co wydawało się niepotrzebnym osądem. Prawidłowe użycie ramki problemów z sygnaturami czasowymi prezentacji. W przypadku gier: przewodnik po tempie kadru znajdziesz więcej informacji o tym, jak unikać osądzania, i rozważ korzystanie z bibliotekę Android Frame Pacing,
W niektórych przypadkach platforma może przełączyć się na wielokrotność liczby klatek na sekundę przez aplikację
określono w funkcji setFrameRate()
. Aplikacja może na przykład dzwonić pod setFrameRate()
z częstotliwością 60 Hz, a urządzenie może przełączyć wyświetlacz na 120 Hz. Jedną z przyczyn
dzieje się, gdy inna aplikacja ma powierzchnię z częstotliwością klatek 24 Hz. W
w tym przypadku wybór częstotliwości 120 Hz umożliwi korzystanie
z 60 Hz
Powierzchnia 24 Hz działająca bez konieczności opuszczania ekranu.
Gdy na ekranie jest wielokrotna liczba klatek aplikacji, należy określić sygnatury czasowe prezentacji dla każdej klatki, aby uniknąć zbędnych jurorzy. W przypadku gier biblioteka Android Frame Pacing pomaga ustawiania sygnatur czasowych prezentacji ramki.
setFrameRate() a PreferredDisplayModeId
WindowManager.LayoutParams.preferredDisplayModeId
to kolejny sposób, w jaki aplikacje mogą określać na platformie liczbę klatek. Niektóre
Aplikacje chcą zmienić tylko częstotliwość odświeżania wyświetlacza,
ustawieniach trybu wyświetlania, takich jak rozdzielczość wyświetlacza. Ogólnie rzecz biorąc, należy użyć funkcji
setFrameRate()
zamiast preferredDisplayModeId
. setFrameRate()
jest łatwiejsza w użyciu, ponieważ aplikacja nie musi przeszukiwać
tryb wyświetlania, który pozwala znaleźć tryb z konkretną liczbą klatek.
setFrameRate()
daje platformie większe możliwości wyboru zgodnej usługi
w sytuacjach, w których jest wiele platform wyświetlanych
różne liczby klatek. Przeanalizujmy scenariusz, w którym 2 aplikacje są
działanie w trybie podzielonego ekranu na Pixelu 4, gdzie jedna aplikacja odtwarza filmy z częstotliwością 24 Hz;
a drugi pokazuje użytkownikowi listę, którą można przewijać. Pixel 4 obsługuje dwa
częstotliwość odświeżania wyświetlacza: 60 Hz i 90 Hz. Za pomocą interfejsu API preferredDisplayModeId
:
zostanie wymuszone wybranie częstotliwości 60 Hz lub 90 Hz. Przez telefon
setFrameRate()
przy częstotliwości 24 Hz umożliwia platformie wideo jeszcze więcej
informacji o liczbie klatek filmu źródłowego, dzięki czemu platforma może
wybierz 90 Hz dla częstotliwości odświeżania ekranu, która jest lepsza niż 60 Hz w tym przypadku.
Istnieją jednak sytuacje, w których należy używać właściwości preferredDisplayModeId
.
zamiast setFrameRate()
, na przykład:
- Jeśli aplikacja chce zmienić rozdzielczość lub inne ustawienia trybu wyświetlania,
użyj funkcji
preferredDisplayModeId
. - Platforma przełącza tryby wyświetlania tylko w odpowiedzi na wywołanie
setFrameRate()
, jeśli przełącznik trybu jest niewielki i prawdopodobnie nie będzie widoczna dla użytkownika. Jeśli aplikacja woli zmienić odświeżanie ekranu nawet wtedy, gdy wymagane jest włączenie dużego przełącznika trybu (na przykład na Androidzie TV urządzenia), użyj funkcjipreferredDisplayModeId
. - Aplikacje, które nie mogą obsłużyć wyświetlacza działającego w wielu ramce aplikacji.
stawki, która wymaga ustawienia sygnatur czasowych prezentacji w każdej klatce,
użyj funkcji
preferredDisplayModeId
.
setFrameRate() a PreferredRefreshRate
WindowManager.LayoutParams#preferredRefreshRate
ustawia preferowaną liczbę klatek w oknie aplikacji i zostanie ona zastosowana.
na wszystkich powierzchniach okna. Aplikacja powinna określić preferowane ustawienie.
liczby klatek niezależnie od obsługiwanych częstotliwości odświeżania, podobnie jak
setFrameRate()
, aby dać algorytmowi szeregowania lepszą wskazówkę dotyczącą zamierzonego działania aplikacji
liczby klatek na sekundę.
Pole preferredRefreshRate
jest ignorowane w przypadku platform, które używają setFrameRate()
. W
w miarę możliwości używaj ogólnego atrybutu setFrameRate()
.
preferowany częstotliwość odświeżania a PreferredDisplayModeId
Jeśli aplikacje chcą tylko zmienić preferowaną częstotliwość odświeżania,
preferredRefreshRate
, a nie preferredDisplayModeId
.
unikanie zbyt częstego wywoływania funkcji setFrameRate();
Chociaż wywołanie funkcji setFrameRate()
nie jest bardzo kosztowne pod względem skuteczności,
aplikacje nie powinny wywoływać elementu setFrameRate()
co klatkę lub wiele razy
sekunda. Połączenia z numerem setFrameRate()
prawdopodobnie mogą spowodować zmianę w
częstotliwość odświeżania wyświetlacza, co może spowodować spadek liczby klatek podczas przejścia.
Należy z wyprzedzeniem określić prawidłową liczbę klatek i zadzwonić
setFrameRate()
raz.
Do użytku w grach i aplikacjach innych niż wideo.
Chociaż filmy są głównym przypadkiem użycia interfejsu API setFrameRate()
, może być ono
używane w innych aplikacjach. Na przykład gra, która nie chce uruchomić więcej niż
60 Hz (aby zmniejszyć zużycie energii i zapewnić dłuższe sesje gry) może wywołać
Surface.setFrameRate(60, Surface.FRAME_RATE_COMPATIBILITY_DEFAULT)
W tym
urządzenia, które domyślnie działają z częstotliwością 90 Hz, będą działać z częstotliwością 60 Hz,
gra jest aktywna, co pozwoli uniknąć efektu żołądka występującego w innym przypadku, jeśli
gra działała z częstotliwością 60 Hz, a wyświetlacz – z 90 Hz.
Wykorzystanie FRAME_RATE_COMPATIBILITY_FIXED_SOURCE
Aplikacja FRAME_RATE_COMPATIBILITY_FIXED_SOURCE
jest przeznaczona tylko dla aplikacji wideo. Dla:
inne niż wideo, użyj FRAME_RATE_COMPATIBILITY_DEFAULT
.
Wybieranie strategii zmiany liczby klatek
- Zdecydowanie zalecamy, aby do wyświetlania długich filmów, takich jak
filmy, połączenie
setFrameRate(
kl./s, FRAME_RATE_COMPATIBILITY_FIXED_SOURCE, CHANGE_FRAME_RATE_ALWAYS)
gdzie kl./s to liczba klatek w filmie. - Zdecydowanie odradzamy używanie aplikacji wywołujących
setFrameRate()
z użyciemCHANGE_FRAME_RATE_ALWAYS
gdy spodziewasz się, że odtwarzanie filmu potrwa kilka minut lub krócej.
Przykładowa integracja z aplikacjami do odtwarzania filmów
Aby zintegrować przełączniki częstotliwości odświeżania z aplikacjami do odtwarzania filmów, zalecamy wykonanie tych czynności:
- Wybierz
changeFrameRateStrategy
:- W przypadku odtwarzania długotrwałego filmu, na przykład filmu, użyj funkcji
MATCH_CONTENT_FRAMERATE_ALWAYS
. - Jeśli odtwarzasz krótki film, np. zwiastun z przenoszeniem, użyj aplikacji
CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS
- W przypadku odtwarzania długotrwałego filmu, na przykład filmu, użyj funkcji
- Jeśli
changeFrameRateStrategy
toCHANGE_FRAME_RATE_ONLY_IF_SEAMLESS
przejdź do kroku 4. - Sprawdź, czy nastąpi niepłynna zmiana częstotliwości odświeżania.
że oba te fakty są prawdziwe:
- Przy obecnej częstotliwości odświeżania nie można przełączyć trybu płynnego (
C) do liczby klatek filmu (nazwijmy ją V). Dzięki temu
niezależnie od tego, czy C i V są różne,
Display.getMode().getAlternativeRefreshRates
nie zawiera wielokrotności V. - Użytkownik wyraził zgodę na niepłynne zmiany częstotliwości odświeżania. Możesz wykryć,
to, sprawdzając, czy
DisplayManager.getMatchContentFrameRateUserPreference
zwracaMATCH_CONTENT_FRAMERATE_ALWAYS
- Przy obecnej częstotliwości odświeżania nie można przełączyć trybu płynnego (
C) do liczby klatek filmu (nazwijmy ją V). Dzięki temu
niezależnie od tego, czy C i V są różne,
- Jeśli przejście będzie działać bezproblemowo, wykonaj te czynności:
- Zadzwoń pod numer
setFrameRate
i przekazaćfps
,FRAME_RATE_COMPATIBILITY_FIXED_SOURCE
, ichangeFrameRateStrategy
, gdziefps
to liczba klatek filmu. - Rozpocznij odtwarzanie filmu
- Zadzwoń pod numer
- Jeśli nastąpi zmiana trybu niepłynnego, wykonaj te czynności:
- Pokaż UX, aby powiadomić użytkownika. Pamiętaj, że zalecamy wdrożenie sposobu zamknięcia tego UX i pominięcia dodatkowego opóźnienia w kroku 5.d. To jest bo zalecane opóźnienie jest większe niż konieczne w przypadku wyświetlaczy, są szybsze.
- Zadzwoń pod numer
setFrameRate
i przekazaćfps
,FRAME_RATE_COMPATIBILITY_FIXED_SOURCE
, iCHANGE_FRAME_RATE_ALWAYS
, gdziefps
to liczba klatek filmu. - Poczekaj na
onDisplayChanged
. oddzwanianie. - Poczekaj 2 sekundy na zakończenie przełączania trybu.
- Rozpocznij odtwarzanie filmu
Pseudokod służący do obsługi płynnego przełączania tylko wygląda tak:
SurfaceControl.Transaction transaction = new SurfaceControl.Transaction();
transaction.setFrameRate(surfaceControl,
contentFrameRate,
FRAME_RATE_COMPATIBILITY_FIXED_SOURCE,
CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS);
transaction.apply();
beginPlayback();
Pseudokod do obsługi płynnego i niepłynnego przełączania zgodnie z opisem powyżej jest następujący:
SurfaceControl.Transaction transaction = new SurfaceControl.Transaction();
if (isSeamlessSwitch(contentFrameRate)) {
transaction.setFrameRate(surfaceControl,
contentFrameRate,
FRAME_RATE_COMPATIBILITY_FIXED_SOURCE,
CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS);
transaction.apply();
beginPlayback();
} else if (displayManager.getMatchContentFrameRateUserPreference()
== MATCH_CONTENT_FRAMERATE_ALWAYS) {
showRefreshRateSwitchUI();
sleep(shortDelaySoUserSeesUi);
displayManager.registerDisplayListener(…);
transaction.setFrameRate(surfaceControl,
contentFrameRate,
FRAME_RATE_COMPATIBILITY_FIXED_SOURCE,
CHANGE_FRAME_RATE_ALWAYS);
transaction.apply();
waitForOnDisplayChanged();
sleep(twoSeconds);
hideRefreshRateSwitchUI();
beginPlayback();
}