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:
- Nowe interfejsy HAL wprowadzone w
android.hardware.graphics.composer@2.4
. - 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
Do android.hardware.graphics.composer@2.4 HAL
dodano obsługę przełączania częstotliwości odświeżania.
Zdecydowanie zalecamy korzystanie z tej wersji, ponieważ poprzednie wersje biblioteki HAL kompozytora mają ograniczone wsparcie dla przełączania częstotliwości odświeżania.
Grupy konfiguracji
Do tabeli IComposerClient::Attribute
został dodany nowy atrybut CONFIG_GROUP
, który można uwzględnić w zapytaniach wysyłanych 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. Rozwiązaniem jest użycie grup konfiguracji. poprzez zgrupowanie częstotliwości 60 Hz i 90 Hz w jednej grupie konfiguracji, a częstotliwości 48 Hz i 72 Hz w drugiej 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. - setActiveConfigWithConstraints
- Metoda
setActiveConfigWithConstraints
to nowe rozszerzenie istniejącej 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 do tych buforów i zapewnia, że przejście na inną częstotliwość odświeżania będzie jak najbardziej płynne. - seamlessRequired
- 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 zablokować niektóre zmiany konfiguracji, które mogłyby spowodować zauważalne artefakty wizualne. 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 czas wCLOCK_MONOTONIC
, gdy nowy wyświetlacz zacznie 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 HAL ma parametr
refreshRequired
, który wskazuje, że potrzebna jest klatka odświeżania, oraz parametrrefreshTimeNanos
, który wskazuje pierwszy sygnał vsync, po którym należy wysłać taką klatkę.- onVsyncPeriodTimingChanged [callback]
- Nowa funkcja wywoływana przez HAL, która informuje platformę, że zmienił się jakiś parametr osi czasu i platforma musi ją odpowiednio dostosować. Ta funkcja jest wywoływana, jeśli z jakiegoś powodu nie udało się użyć starego harmonogramu z powodu długiego czasu przetwarzania w HAL lub późnego interwału odświeżania.
Jak platforma decyduje o zmianie częstotliwości odświeżania?
Wybór częstotliwości odświeżania odbywa się w 2 usługach systemowych:
- DisplayManager
- Opcja
DisplayManager
określa ogólne zasady dotyczące 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, ustawiając konfigurację, która należy do tej samej grupy konfiguracji co konfiguracja domyślna, z częstotliwością odświeżania w zakresie minimalnym/maksymalnym.
Aby określić zasadę, Menedżer reklam displayowych 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 iterację warunków systemowych
- Domyślne ustawienie częstotliwości odświeżania: domyślna wartość częstotliwości odświeżania jest ustawiona 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 ustawienia
Settings.System.PEAK_REFRESH_RATE
. Ta wartość jest zmieniana w czasie wykonywania, aby odzwierciedlać bieżące ustawienie urządzenia (np. z opcji 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. - Application requested ModeId: aplikacje mogą ustawiać
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: gdy urządzenie jest w trybie niskiego zużycia energii, częstotliwość odświeżania jest ograniczona do 60 Hz lub niżej. Informuje o tym ikona
Settings.Global.LOW_POWER_MODE.
- Domyślne ustawienie częstotliwości odświeżania: domyślna wartość częstotliwości odświeżania jest ustawiona 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
zawiera 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 została ustawiona częstotliwość klatek. SurfaceFlinger stosuje heurystykę, która pozwala mu określać średnią liczbę klatek na sekundę, jaką warstwa przesyła do buforów, na podstawie sygnatury czasowej wyświetlania dołączonej 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 dotyka ekranu przez skonfigurowany czas oczekiwania. Heurystyka jest gotowa do działania z domyślną 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 przez skonfigurowany czas oczekiwania nie będzie żadnych aktualizacji ekranu.ro.surface_flinger.set_display_power_timer_ms
: jeśli wartość jest większa niż 0, podczas włączania wyświetlacza (lub wyłączania trybu AOD) będzie używana domyślna częstotliwość odświeżania przez czas określony w czasie oczekiwania.
Interfejs API Liczba klatek
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 dodano nową opcję dla deweloperów, która przełącza nakładkę na ekranie 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.