Wiele częstotliwości odświeżania

W Androidzie 11 dodano obsługę urządzeń z wieloma częstotliwościami odświeżania. Na tę funkcję składają się trzy główne elementy:

  • 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 SDK i NDK umożliwiające aplikacjom ustawienie żądanej liczby klatek na sekundę

Realizacja

Do android.hardware.graphics.composer@2.4 HAL dodano dedykowaną obsługę przełączania częstotliwości odświeżania. Zdecydowanie zalecamy używanie tej wersji, ponieważ poprzednie wersje kompozytora HAL mają ograniczoną obsługę przełączania częstotliwości odświeżania.

Grupy konfiguracyjne

Do IComposerClient::Attribute dodano nowy atrybut CONFIG_GROUP , do którego można wysyłać zapytania przy użyciu interfejsu API getDisplayAttribute_2_4 . Ten atrybut umożliwia dostawcom grupowanie konfiguracji wyświetlaczy. Konfiguracje w tej samej grupie pozwalają w większości przypadków na płynne przełączanie się pomiędzy nimi. Grupa config jest używana przez platformę do rozróżnienia, które konfiguracje można między nimi przełączać w celu zmiany częstotliwości odświeżania, a nie innych atrybutów konfiguracji.

Rozważ następujący przykład demonstrujący korzyści wynikające z używania grup konfiguracyjnych w przypadku urządzenia obsługującego cztery konfiguracje wyświetlaczy:

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

Mimo że 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 powoduje zmianę konfiguracji wyświetlania z 1080p na 1080i, co może nie być pożądanym zachowaniem. Można to rozwiązać za pomocą grup konfiguracyjnych. Grupując 60 Hz i 90 Hz w jednej grupie konfiguracyjnej oraz 48 Hz i 72 Hz w innej grupie konfiguracyjnej. 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 zwykłą zmianę częstotliwości odświeżania.

Aktualizacje interfejsu API kompozytora

getDisplayVsyncPeriod
Dla lepszej kontroli i przewidywalności przy zmianie częstotliwości odświeżania dodano getDisplayVsyncPeriod . getDisplayVsyncPeriod zwraca bieżącą częstotliwość odświeżania (w okresie vsync), z jaką działa wyświetlacz. Jest to szczególnie przydatne, gdy przejście między częstotliwością odświeżania a bieżącą częstotliwością odświeżania jest potrzebne platformie, aby zdecydować, kiedy rozpocząć następną klatkę.
setActiveConfigWithConstraints
Metoda setActiveConfigWithConstraints stanowi nowe rozszerzenie istniejącej metody setActiveConfig i dostarcza więcej informacji na temat zmiany konfiguracji. Ograniczenia są podawane jako część parametrów vsyncPeriodChangeConstraints i zawierają następujące parametry.
    pożądany czasNanos
    Czas w CLOCK_MONOTONIC , po którym okres vsync może się zmienić (tzn. okres vsync nie może się zmienić przed tym czasem). Jest to przydatne, gdy platforma chce zaplanować z wyprzedzeniem zmianę częstotliwości odświeżania, ale ma już pewne bufory w kolejce do zaprezentowania. Platforma odpowiednio ustawia ten czas, aby uwzględnić te bufory i mieć pewność, że przejście częstotliwości odświeżania będzie możliwie płynne.
    bez szwuWymagane
    Jeśli to prawda, wymaga, aby zmiana okresu vsync przebiegała płynnie i bez zauważalnych artefaktów wizualnych. Ta flaga jest używana przez platformę, gdy konieczna jest zmiana częstotliwości odświeżania w wyniku zmiany treści (na przykład urządzenie jest bezczynne i rozpoczyna się animacja). Daje to dostawcy możliwość niedopuszczenia do pewnych zmian konfiguracji, gdy mogą one skutkować zauważalnym artefaktem wizualnym. Jeśli konfiguracji nie można płynnie zmienić, a seamlessRequired ma wartość true , oczekuje się, że implementacja zwróci SEAMLESS_NOT_POSSIBLE jako kod powrotu i wywoła nowe wywołanie onSeamlessPossible , gdy tę samą zmianę konfiguracji można wykonać bezproblemowo.

Po pomyślnym wykonaniu implementacja zwraca wartość VsyncPeriodChangeTimeline , która informuje platformę, kiedy można się spodziewać zmiany częstotliwości odświeżania. Parametry newVsyncAppliedTimeNanos muszą być ustawione na czas w CLOCK_MONOTONIC , kiedy nowy wyświetlacz zacznie się odświeżać w nowym okresie vsync. To, wraz z desiredTimeNanos , umożliwia platformie zaplanowanie z wyprzedzeniem zmiany częstotliwości odświeżania i rozpoczęcie zaznaczania aplikacji z wyprzedzeniem dla nowej częstotliwości odświeżania. Umożliwia to płynne przejście częstotliwości odświeżania.

Niektóre implementacje wymagają wysłania ramki odświeżania, zanim będzie można wysłać częstotliwość odświeżania. W tym celu warstwa HAL ma parametr refreshRequired wskazujący, że wymagana jest ramka odświeżania, oraz refreshTimeNanos wskazujący pierwszą synchronizację vsync, po której należy wysłać ramkę odświeżania.

onVsyncPeriodTimingChanged [oddzwonienie]
Nowe wywołanie zwrotne, które może zostać wywołane przez warstwę HAL w celu wskazania platformie, że jakiś parametr osi czasu uległ zmianie i platforma musi dostosować swoją oś czasu. Oczekuje się, że to wywołanie zwrotne zostanie wywołane, jeśli z jakiegoś powodu stara oś czasu została pominięta z powodu długiego czasu przetwarzania w warstwie HAL lub późnej ramki odświeżania.

W jaki sposób platforma decyduje o zmianie częstotliwości odświeżania?

Wybór częstotliwości odświeżania odbywa się w następujących dwóch usługach systemowych:

Menedżer wyświetlania
DisplayManager ustawia 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, które SurfaceFlinger może wybrać jako częstotliwość odświeżania.
SurfaceFlinger
Określa częstotliwość odświeżania poprzez ustawienie konfiguracji znajdującej się w tej samej grupie konfiguracyjnej co konfiguracja domyślna i z częstotliwością odświeżania w zakresie min/max.

Menedżer wyświetlania wykonuje następujące kroki, aby określić politykę:

  • Znajduje domyślny identyfikator konfiguracji, wysyłając zapytanie do aktywnej konfiguracji z SurfaceFlinger
  • Ograniczanie zakresu wartości minimalnych i maksymalnych poprzez iterację po warunkach systemowych
    • Domyślne ustawienie częstotliwości odświeżania : domyślna wartość częstotliwości odświeżania jest ustawiana w nakładce konfiguracyjnej R.integer.config_defaultRefreshRate . Ta wartość służy do określenia standardowej częstotliwości odświeżania urządzenia dla animacji i interakcji dotykowych.
    • Ustawienie szczytowej częstotliwości odświeżania : Wartość szczytowej częstotliwości odświeżania jest odczytywana z Settings.System.PEAK_REFRESH_RATE . Ta wartość jest zmieniana w czasie wykonywania, aby odzwierciedlić bieżące ustawienia urządzenia (np. z opcji menu). Wartość domyślna jest ustawiana w nakładce konfiguracyjnej R.integer.config_defaultPeakRefreshRate .
    • Ustawienie minimalnej częstotliwości odświeżania : Wartość minimalnej częstotliwości odświeżania jest odczytywana z Settings.System.MIN_REFRESH_RATE . Wartość tę można zmienić w czasie wykonywania, aby odzwierciedlić bieżące ustawienia urządzenia (np. z poziomu opcji menu). Wartość domyślna to 0, więc nie ma domyślnego minimum.
    • Aplikacja zażądała ModeId : aplikacje mogą ustawić WindowManager.LayoutParams.preferredDisplayModeId , aby odzwierciedlały preferowaną konfigurację, w której powinien działać wyświetlacz. W większości warunków DisplayManager ustawia odpowiednio domyślny identyfikator konfiguracji oraz ustawia minimalną i maksymalną częstotliwość odświeżania, aby dopasować ją 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 znajduje się w trybie niskiego zużycia energii, co jest wskazywane w Settings.Global.LOW_POWER_MODE.

Gdy DisplayManager ustawi zasady, SurfaceFlinger ustawia częstotliwość odświeżania na podstawie aktywnych warstw (warstw, które kolejkują aktualizacje klatek). Jeśli właściciel warstwy ustawi liczbę klatek na sekundę , SurfaceFlinger spróbuje ustawić częstotliwość odświeżania na wartość stanowiącą mnożnik tej szybkości. Na przykład, jeśli dwie aktywne warstwy ustawią liczbę klatek na sekundę na 24 i 60, SurfaceFlinger wybierze 120 Hz, jeśli jest dostępne. Jeśli taka częstotliwość odświeżania nie jest dostępna dla SurfaceFlinger, spróbuje wybrać częstotliwość odświeżania, która ma minimalny błąd dla liczby klatek na sekundę. Więcej informacji znajdziesz w dokumentacji dla programistów na stronie developer.android.com

SurfaceFlinger utrzymuje następujące flagi, aby kontrolować sposób ustalania częstotliwości odświeżania:

  • ro.surface_flinger.use_content_detection_for_refresh_rate: Jeśli ustawione, częstotliwość odświeżania jest ustalana na podstawie aktywnych warstw, nawet jeśli liczba klatek na sekundę nie została ustawiona. SurfaceFlinger utrzymuje heurystykę, w której wyszukuje średnią liczbę klatek na sekundę, w której warstwa wysyła bufory, sprawdzając sygnaturę czasową prezentacji dołączoną do bufora.
  • ro.surface_flinger.set_touch_timer_ms : jeśli > 0, gdy użytkownik dotknie ekranu, zostanie użyta domyślna częstotliwość odświeżania przez skonfigurowany limit czasu. Ta heurystyka ma na celu przygotowanie się do domyślnej częstotliwości 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 nie będzie aktualizacji ekranu przez skonfigurowany limit czasu.
  • ro.surface_flinger.set_display_power_timer_ms : jeśli > 0, przy włączaniu wyświetlacza (lub przy wyjściu z AOD) zostanie użyta domyślna częstotliwość odświeżania przez skonfigurowany limit czasu.

API szybkości klatek

Interfejs API szybkości klatek pozwala aplikacjom informować platformę Androida o zamierzonej liczbie klatek na sekundę i jest dostępny w aplikacjach przeznaczonych dla systemu Android 11. Aby dowiedzieć się więcej na temat interfejsu API szybkości klatek, zapoznaj się z dokumentacją dla programistów w witrynie developer.android.com .

Opcje programistyczne

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