Wielokrotne odświeżanie

Android 11 obsługuje urządzenia z różnymi częstotliwościami odświeżania. Ta funkcja składa się z 3 głównych elementów:

  • android.hardware.graphics.composer@2.4 wprowadzono nowe interfejsy HAL API.
  • Kod platformy do parsowania konfiguracji urządzenia pod kątem różnych częstotliwości odświeżania i ustawienia żą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

Specjalna obsługa przełączania częstotliwości odświeżania została dodana do wersji android.hardware.graphics.composer@2.4 HAL. Zdecydowanie zalecamy korzystanie z tej wersji, ponieważ poprzednie wersje HAL kompozytora obsługiwały ograniczoną częstotliwość odświeżania.

Grupy konfiguracji

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

Rozważ ten przykład, który pokazuje zalety korzystania z grup konfiguracji na urządzeniu obsługującym 4 konfiguracje wyświetlania:

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

Mimo że urządzenie obsługuje częstotliwość odświeżania 48 Hz, 60 Hz, 72 Hz i 90 Hz, wyświetlacz działa w innym trybie, a przejście z 60 Hz na 72 Hz zmienia konfigurację wyświetlacza z 1080p na 1080i, co może nie być pożądanym działaniem. Można go rozwiązać za pomocą grup konfiguracji. Przez zgrupowanie 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łączyć się z 60 Hz na 90 Hz i z 48 Hz na 72 Hz, ale nie z 60 Hz na 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żania, dodano opcję getDisplayVsyncPeriod . getDisplayVsyncPeriod zwraca bieżącą częstotliwość odświeżania (w ujęciu okresu vsync), z jaką działa wyświetlacz. Jest to szczególnie przydatne podczas przechodzenia między częstotliwościami odświeżania, ponieważ platforma potrzebuje bieżącej częstotliwości odświeżania, aby zdecydować, kiedy rozpocząć wyświetlanie następnego obrazu.
ustawActiveConfigWithConstraints
Metoda setActiveConfigWithConstraints to nowe rozszerzenie dotychczasowej metody setActiveConfig, które zawiera 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 vsync może się zmienić (czyli okres synchronizacji vsync nie może się zmienić przed tym czasem). Jest to przydatne, gdy platforma chce zaplanować zmianę częstotliwości odświeżania, ale ma już w kolejce pewne bufory do wyświetlenia. Platforma ustawia ten czas odpowiednio, aby uwzględnić te bufory i zadbać o to, aby przejście częstotliwości odświeżania było możliwie najpłynniejsze.
    bez komplikacjiWymagane
    Jeśli jest ustawiona na „Prawda”, zmiana okresu vsync musi nastąpić płynnie, bez zauważalnych artefaktów wizualnych. Ten parametr jest używany przez platformę, gdy zmiana częstotliwości odświeżania jest wymagana w wyniku zmiany treści (na przykład gdy urządzenie jest nieaktywne, a rozpoczyna się animacja). Dzięki temu dostawca może nie zezwalać na określone zmiany konfiguracji, jeśli mogłoby to spowodować wyświetlenie widocznego artefaktu. Jeśli konfiguracji nie można zmienić płynnie i wartość parametru seamlessRequired to true, implementacja powinna zwrócić SEAMLESS_NOT_POSSIBLE jako kod zwracany i wywołać nową funkcję wywołania zwrotnego onSeamlessPossible, gdy można płynnie wprowadzić tę samą zmianę konfiguracji.

Po pomyślnym zakończeniu implementacja zwraca wartość VsyncPeriodChangeTimeline, która informuje platformę, kiedy nastąpi zmiana częstotliwości odświeżania. Parametry newVsyncAppliedTimeNanos muszą być ustawione na godzinę w CLOCK_MONOTONIC, o której nowy wyświetlacz zacznie się odświeżać w nowym okresie vsync. Dzięki temu i funkcji desiredTimeNanos platforma może z wyprzedzeniem zaplanować zmianę częstotliwości odświeżania i zacząć wcześniej uruchamiać aplikacje z nową częstotliwością odświeżania. Umożliwia to płynne przejście do nowej częstotliwości odświeżania.

Niektóre implementacje wymagają wysłania ramki odświeżania, zanim można wysłać częstotliwość odświeżania. W tym celu interfejs HAL ma parametr refreshRequired, który wskazuje, że potrzebna jest klatka odświeżania, oraz parametr refreshTimeNanos, który wskazuje pierwszy sygnał synchronizacji pionowej, po którym należy wysłać taką klatkę.

onVsyncPeriodTimingChanged [callback]
Nowy wywoływany przez HAL callback, który informuje platformę, że zmienił się jakiś parametr harmonogramu i platforma musi go dostosować. To wywołanie zwrotne powinno być wywoływane, jeśli z jakiegoś powodu stara oś czasu została nieodebrana z powodu długiego czasu przetwarzania w HAL lub późnej klatki 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 tych 2 usługach systemowych:

DisplayManager
DisplayManager określa ogólną zasadę dotyczącą częstotliwości odświeżania. Ustawia domyślną konfigurację wyświetlania, która jest taka sama jak konfiguracja HAL w komponencie. Dodatkowo określa zakres minimalnych i maksymalnych wartości parametru SurfaceFlinger, z których można wybrać częstotliwość odświeżania.
SurfaceFlinger
Określa częstotliwość odświeżania przez ustawienie konfiguracji, która jest w tej samej grupie konfiguracji co konfiguracja domyślna, z częstotliwością odświeżania w zakresie min./maks.

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

  • Znajduje identyfikator domyślnej konfiguracji, wysyłając zapytanie do aktywnej konfiguracji z adresu SurfaceFlinger
  • Ograniczanie zakresu wartości minimalnych i maksymalnych przez iterowanie przez warunki systemowe
    • Ustawienie domyślnej częstotliwości odświeżania: wartość domyślnej częstotliwości odświeżania jest ustawiana w przesłonie 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 częstotliwości odświeżania na najwyższym poziomie: wartość częstotliwości odświeżania na najwyższym poziomie jest odczytywana z pliku Settings.System.PEAK_REFRESH_RATE. Ta wartość jest zmieniana w czasie wykonywania, aby odzwierciedlać bieżące ustawienie urządzenia (np. opcję z menu). Wartość domyślna jest ustawiana w poziomie 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 zmieniać w czasie działania, aby odzwierciedlać bieżące ustawienie urządzenia (np. opcję w menu). Wartość domyślna to 0, więc nie ma domyślnej wartości minimalnej.
    • Aplikacja prosi o ModeId: aplikacje mogą ustawić wartość WindowManager.LayoutParams.preferredDisplayModeId, aby odzwierciedlić preferowaną konfigurację, w której ma 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 niższej, gdy urządzenie jest w trybie niskiego zużycia energii, który jest wskazywany przez oznaczenie Settings.Global.LOW_POWER_MODE.

Gdy DisplayManager ustawia zasadę, SurfaceFlinger ustawia częstotliwość odświeżania na podstawie aktywnych warstw (warstw, które kolejkują aktualizacje klatek). Jeśli właściciel warstwy ustawi częstotliwość klatek, SurfaceFlinger próbuje ustawić częstotliwość odświeżania na wartość będącą wielokrotnością tej częstotliwości. Jeśli na przykład 2 aktywne warstwy mają ustawioną częstotliwość klatek na 24 i 60 Hz, SurfaceFlinger wybierze 120 Hz, jeśli będzie to możliwe. Jeśli taka częstotliwość odświeżania jest niedostępna dla SurfaceFlinger, narzędzie spróbuje wybrać częstotliwość odświeżania z minimalnym błędem w przypadku częstotliwości klatek. Więcej informacji znajdziesz w dokumentacji dla deweloperów na stronie developer.android.com.

SurfaceFlinger wykorzystuje te flagi kontrolujące 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 została ustawiona częstotliwość klatek. SurfaceFlinger stosuje mechanizm heurystyczny, w którym wykrywa średnią liczbę klatek na sekundę, którą warstwa publikuje bufory, sprawdzając sygnaturę czasową prezentacji umieszczoną w buforze.
  • ro.surface_flinger.set_touch_timer_ms: jeśli > 0, domyślna częstotliwość odświeżania będzie używana, gdy użytkownik dotyka ekranu przez skonfigurowany czas oczekiwania. Ta heurystyka ma na celu przygotowanie do użycia domyślnej częstotliwości odświeżania animacji.
  • ro.surface_flinger.set_idle_timer_ms: jeśli wartość jest większa niż 0, minimalna częstotliwość odświeżania jest używana, gdy ekran nie jest aktualizowane po upływie skonfigurowanego czasu oczekiwania.
  • ro.surface_flinger.set_display_power_timer_ms: jeśli > 0, podczas włączania wyświetlacza (lub podczas wychodzenia z trybu AOD) przez czas konfigurowanego limitu czasu będzie używana domyślna częstotliwość odświeżania.

Interfejs Frame Rate API

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

Opcje programisty

Do menu dodaliśmy nową opcję dla deweloperów, która przełącza nakładkę na ekranie z aktualną częstotliwością odświeżania. Nowa opcja znajduje się w sekcji Ustawienia > System > Opcje programisty > Pokaż częstotliwość odświeżania.