Liczba klatek

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:

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:

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 funkcji preferredDisplayModeId.
  • 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życiem CHANGE_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:

  1. Wybierz changeFrameRateStrategy:
    1. W przypadku odtwarzania długotrwałego filmu, na przykład filmu, użyj funkcji MATCH_CONTENT_FRAMERATE_ALWAYS.
    2. Jeśli odtwarzasz krótki film, np. zwiastun z przenoszeniem, użyj aplikacji CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS
  2. Jeśli changeFrameRateStrategy to CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS przejdź do kroku 4.
  3. Sprawdź, czy nastąpi niepłynna zmiana częstotliwości odświeżania. że oba te fakty są prawdziwe:
    1. 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.
    2. Użytkownik wyraził zgodę na niepłynne zmiany częstotliwości odświeżania. Możesz wykryć, to, sprawdzając, czy DisplayManager.getMatchContentFrameRateUserPreference zwraca MATCH_CONTENT_FRAMERATE_ALWAYS
  4. Jeśli przejście będzie działać bezproblemowo, wykonaj te czynności:
    1. Zadzwoń pod numer setFrameRate i przekazać fps, FRAME_RATE_COMPATIBILITY_FIXED_SOURCE, i changeFrameRateStrategy, gdzie fps to liczba klatek filmu.
    2. Rozpocznij odtwarzanie filmu
  5. Jeśli nastąpi zmiana trybu niepłynnego, wykonaj te czynności:
    1. 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.
    2. Zadzwoń pod numer setFrameRate i przekazać fps, FRAME_RATE_COMPATIBILITY_FIXED_SOURCE, i CHANGE_FRAME_RATE_ALWAYS, gdzie fps to liczba klatek filmu.
    3. Poczekaj na onDisplayChanged. oddzwanianie.
    4. Poczekaj 2 sekundy na zakończenie przełączania trybu.
    5. 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();
}