Wiele częstotliwości odświeżania

Android 11 dodaje obsługę urządzeń z różnymi częstotliwościami odświeżania. Ta funkcja ma 3 główne komponenty:

  • Nowe interfejsy HAL API 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 SDK i NDK API, które umożliwiają aplikacjom ustawianie żądanej liczby klatek na sekundę.

Implementacja

Dodaliśmy dedykowaną obsługę przełączania częstotliwości odświeżania w …Zdecydowanie zalecamy korzystanie z tej wersji, ponieważ poprzednie wersje HAL kompozytora mają ograniczoną obsługę przełączania częstotliwości odświeżania.

Grupy konfiguracji

Do IComposerClient::Attribute dodaliśmy nowy atrybut CONFIG_GROUP, który można wysyłać za pomocą interfejsu getDisplayAttribute_2_4 API. Ten atrybut umożliwia dostawcom grupowanie konfiguracji wyświetlania. Konfiguracje w tej samej grupie w większości przypadków umożliwiają płynne przełączanie się między nimi. Platforma używa grupy konfiguracji, aby odróżnić, które konfiguracje można 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@60Hz
  • 1080p@90Hz
  • 1080i@72Hz
  • 1080i@48Hz

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 zmienia konfigurację wyświetlacza z 1080p na 1080i, co może nie być pożądanym zachowaniem. Grupy konfiguracji rozwiązują ten problem. Grupując 60 Hz i 90 Hz w jednej grupie konfiguracji oraz 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ż powoduje to zmianę konfiguracji, a nie tylko częstotliwości odświeżania.

Aktualizacje interfejsu Composer API

getDisplayVsyncPeriod
Aby zapewnić lepszą kontrolę i przewidywalność podczas zmiany częstotliwości odświeżania, getDisplayVsyncPeriod dodaliśmy funkcję. getDisplayVsyncPeriod zwraca bieżącą częstotliwość odświeżania (w postaci okresu synchronizacji pionowej), z jaką działa wyświetlacz. Jest to szczególnie przydatne podczas przechodzenia między częstotliwościami odświeżania, gdy platforma potrzebuje bieżącej częstotliwości odświeżania aby zdecydować, kiedy rozpocząć następną klatkę.
setActiveConfigWithConstraints
Metoda setActiveConfigWithConstraints to nowe rozszerzenie istniejącej metody setActiveConfig, które zawiera więcej informacji o zmianie konfiguracji. Ograniczenia są podawane jako część parametrów vsyncPeriodChangeConstraints i zawierają te parametry:
    desiredTimeNanos
    Czas w CLOCK_MONOTONIC, po którym można zmienić okres synchronizacji pionowej (tzn. okres synchronizacji pionowej nie może się zmienić przed tym czasem). Jest to przydatne, gdy platforma chce z wyprzedzeniem zaplanować zmianę częstotliwości odświeżania , ale ma już w kolejce kilka buforów do wyświetlenia. Platforma ustawia ten czas odpowiednio, aby uwzględnić te bufory i zapewnić jak najpłynniejsze przejście częstotliwości odświeżania.
    seamlessRequired
    Jeśli ma wartość true, wymaga, aby zmiana okresu synchronizacji pionowej odbywała się płynnie bez zauważalnych artefaktów wizualnych. Platforma używa tej flagi, gdy zmiana częstotliwości odświeżania jest potrzebna w wyniku zmiany treści (np. urządzenie jest bezczynne i rozpoczyna się animacja). Daje to dostawcy możliwość niedopuszczenia do pewnych zmian konfiguracji, gdy mogą one powodować zauważalne artefakty wizualne. Jeśli konfiguracji nie można zmienić płynnie, a seamlessRequired ma wartość true, implementacja powinna zwrócić SEAMLESS_NOT_POSSIBLE jako kod powrotu i wywołać nowe wywołanie zwrotne onSeamlessPossible, gdy tę samą zmianę konfiguracji można wprowadzić płynnie.

W przypadku powodzenia implementacja zwraca VsyncPeriodChangeTimeline, która informuje platformę, kiedy ma nastąpić zmiana częstotliwości odświeżania. Parametry newVsyncAppliedTimeNanos należy ustawić na czas w CLOCK_MONOTONIC, kiedy nowy wyświetlacz zacznie odświeżać z nowym okresem synchronizacji pionowej. W połączeniu z desiredTimeNanos umożliwia to platformie z wyprzedzeniem zaplanowanie przełączenia częstotliwości odświeżania i wcześniejsze rozpoczęcie taktowania aplikacji z nową 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 klatki odświeżania, zanim będzie można wysłać częstotliwość odświeżania. W tym celu HAL ma refreshRequired parametr, który wskazuje, że potrzebna jest klatka odświeżania, oraz refreshTimeNanos który wskazuje pierwszą synchronizację pionową, po której należy wysłać klatkę odświeżania.

onVsyncPeriodTimingChanged [callback]
Nowe wywołanie zwrotne, które HAL może wywołać, 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óźnionej klatki odświeżania frame.

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
Element 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 dla SurfaceFlinger do wyboru 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.

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

  • Znajduje domyślny identyfikator konfiguracji, wysyłając zapytanie o aktywną konfigurację z SurfaceFlinger
  • Ogranicza zakres wartości minimalnych i maksymalnych, iterując po warunkach systemowych
    • Ustawienie domyślnej 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. z opcji menu opcja). Wartość domyślna jest ustawiana w nakładce konfiguracji 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. Tę wartość można zmienić w czasie działania, aby odzwierciedlać bieżące ustawienie urządzenia (np. z opcji menu option). Wartość domyślna to 0, więc nie ma domyślnej wartości minimalnej.
    • 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: gdy urządzenie jest w trybie oszczędzania baterii, częstotliwość odświeżania jest ograniczona do 60 Hz lub niższej. Wskazuje na to Settings.Global.LOW_POWER_MODE.

Gdy DisplayManager ustawi zasady, SurfaceFlinger ustawi częstotliwość odświeżania na podstawie aktywnych warstw (warstw, które umieszczają w kolejce aktualizacje klatek). Jeśli właściciel warstwy ustawi liczbę klatek, SurfaceFlinger spróbuje ustawić częstotliwość odświeżania na wartość, która jest wielokrotnością tej liczby. Jeśli np. 2 aktywne warstwy ustawią liczbę klatek na sekundę na 24 i 60, SurfaceFlinger wybierze 120 Hz, jeśli jest dostępna. 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 w przypadku liczby klatek na sekundę. Więcej informacji znajdziesz w dokumentacji dla deweloperów na stronie 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 jest 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ę, w której 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 > 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 przygotować domyślną częstotliwość odświeżania dla 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 oczekiwania nie będą występować aktualizacje ekranu.
  • ro.surface_flinger.set_display_power_timer_ms: jeśli > 0, domyślna częstotliwość odświeżania będzie używana podczas włączania wyświetlacza (lub wychodzenia z trybu AOD) przez skonfigurowany czas oczekiwania.

Interfejs Frame Rate API

Interfejs Frame Rate API umożliwia aplikacjom informowanie platformy Android o zamierzonej liczbie klatek na sekundę i jest dostępny w aplikacjach, które są przeznaczone na Androida 11. Więcej informacji o interfejsie API liczby klatek znajdziesz w dokumentacji dla deweloperów na stronie developer.android.com.

Opcje programisty

Do menu dodaliśmy nową opcję programisty, która przełą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.