Wiele częstotliwości odświeżania

Android 11 obsługuje urządzenia z wieloma częstotliwościami odświeżania. Ta funkcja ma 3 główne komponenty:

  • Nowe interfejsy API HAL wprowadzone w android.hardware.graphics.composer@2.4.
  • Kod platformy do analizowania konfiguracji urządzeń pod kątem różnych częstotliwości odświeżania i ustawiania żądanej częstotliwości odświeżania
  • Nowe interfejsy API pakietów SDK i NDK, które umożliwiają aplikacjom ustawianie żądanej liczby klatek

Implementacja

Do android.hardware.graphics.composer@2.4 HAL dodaliśmy specjalną obsługę przełączania częstotliwości odświeżania. Zdecydowanie zalecamy korzystanie z tej wersji, ponieważ poprzednie wersje interfejsu HAL kompozytora mają ograniczone wsparcie dla przełączania częstotliwości odświeżania.

Grupy konfiguracji

Do elementu CONFIG_GROUP dodano nowy atrybutIComposerClient::Attribute, który można wyszukiwać za pomocą interfejsu APIgetDisplayAttribute_2_4. Ten atrybut umożliwia dostawcom grupowanie konfiguracji wyświetlania. Konfiguracje w tej samej grupie umożliwiają płynne przełączanie się między nimi w większości przypadków. Grupa konfiguracji jest używana przez platformę do odróżniania konfiguracji, między którymi można się przełączać, aby zmienić częstotliwość odświeżania, a nie inne atrybuty konfiguracji.

Rozważmy ten przykład, który pokazuje korzyści z używania grup konfiguracji na urządzeniu obsługującym 4 konfiguracje wyświetlania:

  • 1080p przy 60 Hz
  • 1080p przy 90 Hz
  • 1080i@72Hz
  • 1080i przy 48 Hz

Chociaż urządzenie obsługuje częstotliwości odświeżania 48 Hz, 60 Hz, 72 Hz i 90 Hz, wyświetlacz działa w innym trybie, a przełączenie z 60 Hz na 72 Hz zmienia konfigurację wyświetlacza z 1080p na 1080i, co może nie być pożądane. Możesz to zrobić za pomocą grup konfiguracji. Grupując 60 Hz i 90 Hz w jednej grupie konfiguracji, a 48 Hz i 72 Hz w innej grupie konfiguracji. Platforma wie, że może przełączać się między 60 Hz a 90 Hz oraz między 48 Hz a 72 Hz, ale nie między 60 Hz a 72 Hz, ponieważ spowoduje to zmianę konfiguracji, a nie tylko częstotliwości odświeżania.

Aktualizacje interfejsu Composer API

getDisplayVsyncPeriod
Aby zapewnić większą kontrolę i przewidywalność podczas zmiany częstotliwości odświeżaniagetDisplayVsyncPeriod . getDisplayVsyncPeriod zwraca bieżącą częstotliwość odświeżania (w okresie synchronizacji pionowej), z jaką działa wyświetlacz. Jest to szczególnie przydatne podczas przechodzenia między częstotliwościami odświeżania, a bieżąca częstotliwość odświeżania jest potrzebna platformie do podjęcia decyzji, kiedy rozpocząć następną klatkę.
setActiveConfigWithConstraints
Metoda setActiveConfigWithConstraints to nowe rozszerzenie istniejącej metody setActiveConfig, które dostarcza więcej informacji o zmianie konfiguracji. Ograniczenia są podawane w ramach parametrów vsyncPeriodChangeConstraints i zawierają te parametry:
    desiredTimeNanos
    Czas w CLOCK_MONOTONIC, po którym okres synchronizacji pionowej może się zmienić (tzn. okres synchronizacji pionowej nie może się zmienić przed tym czasem). Jest to przydatne, gdy platforma chce zaplanować zmianę częstotliwości odświeżania, ale w kolejce ma już buforowane dane do wyświetlenia. Platforma odpowiednio ustawia ten czas, aby uwzględnić te bufory i zapewnić jak najpłynniejsze przejście częstotliwości odświeżania.
    seamlessRequired
    Jeśli wartość to „true”, zmiana okresu synchronizacji pionowej musi nastąpić płynnie, bez widocznych artefaktów. Ten flag jest używany przez platformę, gdy zmiana częstotliwości odświeżania jest potrzebna w wyniku zmiany treści (np. urządzenie jest w stanie bezczynności i rozpoczyna się animacja). Dzięki temu dostawca może zablokować określone zmiany konfiguracji, jeśli mogą one spowodować zauważalne artefakty wizualne. Jeśli konfiguracji nie można zmienić bezproblemowo, a wartość parametru seamlessRequired to true, implementacja powinna zwrócić kod SEAMLESS_NOT_POSSIBLE i wywołać nowy wywołanie zwrotne onSeamlessPossible, gdy tę samą zmianę konfiguracji będzie można wprowadzić bezproblemowo.

W przypadku powodzenia implementacja zwraca wartość VsyncPeriodChangeTimeline, która informuje platformę, kiedy należy się spodziewać zmiany częstotliwości odświeżania. newVsyncAppliedTimeNanos parametry muszą być ustawione na czas w CLOCK_MONOTONIC, w którym nowy wyświetlacz zacznie odświeżać się z nowym okresem synchronizacji pionowej. To w połączeniu z desiredTimeNanos umożliwia platformie wcześniejsze zaplanowanie zmiany częstotliwości odświeżania i wcześniejsze rozpoczęcie odliczania czasu dla aplikacji przy nowej częstotliwości odświeżania. Umożliwia to płynną zmianę częstotliwości odświeżania.

Niektóre implementacje wymagają wysłania klatki odświeżania przed wysłaniem częstotliwości odświeżania. W tym celu HAL ma parametr refreshRequired, który wskazuje, że wymagana jest klatka odświeżania, oraz parametr refreshTimeNanos, który wskazuje pierwszy sygnał VSYNC, po którym należy wysłać klatkę odświeżania.

onVsyncPeriodTimingChanged [callback]
Nowe wywołanie zwrotne, które może być wywoływane przez HAL, aby poinformować platformę, że zmienił się jakiś parametr osi czasu i platforma musi dostosować swoją oś czasu. To wywołanie zwrotne powinno zostać wywołane, jeśli z jakiegoś powodu stara oś czasu została pominięta z powodu długiego czasu przetwarzania w HAL lub opóźnionego odświeżania klatki.

Jak platforma decyduje o zmianie częstotliwości odświeżania?

Wybór częstotliwości odświeżania odbywa się w tych 2 usługach systemowych:

DisplayManager
DisplayManagerOkreśla zasady wysokiego poziomu dotyczące częstotliwości odświeżania. Ustawia domyślną konfigurację wyświetlania, która jest taka sama jak konfiguracja HAL kompozytora. Dodatkowo ustawia zakres wartości minimalnych i maksymalnych dla SurfaceFlinger, które można wybrać jako częstotliwość odświeżania.
SurfaceFlinger
Określa częstotliwość odświeżania, ustawiając konfigurację, która znajduje się w tej samej grupie konfiguracji co konfiguracja domyślna i ma częstotliwość odświeżania w zakresie min./maks.

Menedżer wyświetlania wykonuje te czynności, aby określić zasady:

  • Znajduje domyślny identyfikator konfiguracji, wysyłając zapytanie o aktywną konfigurację z SurfaceFlinger
  • Ograniczanie zakresu wartości minimalnych i maksymalnych przez iterację warunków systemowych
    • Domyślne ustawienie częstotliwości odświeżania: domyślna wartość częstotliwości odświeżania jest ustawiana w nakładce konfiguracji R.integer.config_defaultRefreshRate. Ta wartość służy do określania standardowej częstotliwości odświeżania urządzenia w przypadku animacji i interakcji dotykowych.
    • Ustawienie najwyższej częstotliwości odświeżania: wartość najwyższej częstotliwości odświeżania jest odczytywana z Settings.System.PEAK_REFRESH_RATE. Ta wartość jest zmieniana w czasie działania, aby odzwierciedlać bieżące ustawienie urządzenia (np. opcję menu). Wartość domyślna jest ustawiona w nakładce konfiguracyjnej R.integer.config_defaultPeakRefreshRate.
    • Ustawienie minimalnej częstotliwości odświeżania: minimalna częstotliwość odświeżania jest odczytywana z Settings.System.MIN_REFRESH_RATE. Tę wartość można zmienić w czasie działania aplikacji, aby odzwierciedlała bieżące ustawienie urządzenia (np. za pomocą opcji menu). Wartość domyślna to 0, więc nie ma domyślnego minimum.
    • Identyfikator trybu żądany przez aplikację: aplikacje mogą ustawić WindowManager.LayoutParams.preferredDisplayModeId, aby odzwierciedlać preferowaną konfigurację, w której powinien działać wyświetlacz. W większości przypadków DisplayManager odpowiednio ustawia domyślny identyfikator konfiguracji oraz minimalną i maksymalną częstotliwość odświeżania, aby pasowały do częstotliwości odświeżania konfiguracji.
    • Oszczędzanie baterii: częstotliwość odświeżania jest ograniczona do 60 Hz lub mniej, gdy urządzenie jest w trybie niskiego zużycia energii, co jest sygnalizowane przez ikonę Settings.Global.LOW_POWER_MODE..

Gdy DisplayManager ustawi zasadę, SurfaceFlinger ustawi częstotliwość odświeżania na podstawie aktywnych warstw (warstw, które kolejkuje aktualizacje klatek). Jeśli właściciel warstwy ustawi liczbę klatek na sekundę, SurfaceFlinger próbuje ustawić częstotliwość odświeżania na wartość, która jest wielokrotnością tej liczby. Jeśli na przykład 2 aktywne warstwy ustawią częstotliwość odświeżania na 24 i 60 kl./s, SurfaceFlinger wybierze 120 Hz, jeśli jest dostępna. Jeśli taka częstotliwość odświeżania nie jest dostępna dla SurfaceFlingera, spróbuje on wybrać częstotliwość odświeżania, która ma najmniejszy błąd w przypadku liczby klatek na sekundę. Więcej informacji znajdziesz w dokumentacji dla deweloperów na developer.android.com.

SurfaceFlinger utrzymuje te flagi, aby kontrolować sposób określania częstotliwości odświeżania:

  • ro.surface_flinger.use_content_detection_for_refresh_rate: Jeśli ustawiona częstotliwość odświeżania jest określana na podstawie aktywnych warstw, nawet jeśli nie ustawiono liczby klatek na sekundę. SurfaceFlinger utrzymuje heurystykę, która znajduje średnią liczbę klatek na sekundę, z jaką warstwa publikuje bufory, sprawdzając sygnaturę czasową prezentacji dołączoną do bufora.
  • ro.surface_flinger.set_touch_timer_ms: jeśli wartość jest większa od 0, domyślna częstotliwość odświeżania będzie używana, gdy użytkownik dotknie ekranu przez skonfigurowany czas oczekiwania. Ta heurystyka jest stosowana, aby zapewnić domyślną częstotliwość odświeżania animacji.
  • ro.surface_flinger.set_idle_timer_ms: jeśli > 0, minimalna częstotliwość odświeżania będzie używana, gdy przez skonfigurowany czas nie będą występować aktualizacje ekranu.
  • ro.surface_flinger.set_display_power_timer_ms: jeśli wartość jest większa od 0, domyślna częstotliwość odświeżania będzie używana po włączeniu wyświetlacza (lub po wyjściu z trybu zawsze włączonego) przez skonfigurowany czas oczekiwania.

Frame Rate API

Interfejs API liczby klatek umożliwia aplikacjom informowanie platformy Android o zamierzonej liczbie klatek. Jest on dostępny w aplikacjach kierowanych na Androida 11. Więcej informacji o interfejsie API dotyczącego liczby klatek na sekundę znajdziesz w dokumentacji dla programistów na stronie developer.android.com.

Opcje programisty

Do menu dodano nową opcję programisty, która włącza nakładkę na wyświetlaczu z bieżącą częstotliwością odświeżania. Nowa opcja znajduje się w sekcji Ustawienia > System > Opcje programisty > Pokaż częstotliwość odświeżania.