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:
- 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 metodysetActiveConfig
, które zawiera więcej informacji o zmianie konfiguracji. Ograniczenia są podawane w ramach parametrówvsyncPeriodChangeConstraints
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
totrue
, implementacja powinna zwrócićSEAMLESS_NOT_POSSIBLE
jako kod zwracany i wywołać nową funkcję wywołania zwrotnegoonSeamlessPossible
, 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. ParametrynewVsyncAppliedTimeNanos
muszą być ustawione na godzinę wCLOCK_MONOTONIC
, o której nowy wyświetlacz zacznie się odświeżać w nowym okresie vsync. Dzięki temu i funkcjidesiredTimeNanos
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 parametrrefreshTimeNanos
, 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 parametruSurfaceFlinger
, 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 konfiguracjiR.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ówDisplayManager
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.
- Ustawienie domyślnej częstotliwości odświeżania: wartość domyślnej częstotliwości odświeżania jest ustawiana w przesłonie konfiguracji
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.