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 interfejsu HAL kompozytora mają ograniczone wsparcie dla przełączania częstotliwości odświeżania.
Grupy konfiguracji
Dodano nowy atrybut CONFIG_GROUP
do
IComposerClient::Attribute
, do którego można wysyłać zapytania przy użyciu funkcji
Interfejs API getDisplayAttribute_2_4
. Ten atrybut pozwala dostawcom grupować
razem z konfiguracjami wyświetlania. Konfiguracje w tej samej grupie pozwalają
w większości przypadków umożliwia płynne przełączanie się między nimi. Używana jest grupa konfiguracji
przez platformę, aby rozróżniać konfiguracje, które można przełączać
w celu zmiany częstotliwości odświeżania, a nie innych atrybutów dla
config.
Przyjrzyjmy się przykładowi, który przedstawia zalety używania konfiguracji grupy z urządzeniami obsługującymi cztery konfiguracje wyświetlacza:
- 1080p przy 60 Hz
- 1080p przy 90 Hz
- 1080i przy 72 Hz
- 1080i przy 48 Hz
Mimo że urządzenie obsługuje 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 od 1080p do 1080i, co może nie być pożądane. Można go rozwiązać za pomocą grup konfiguracji. Grupując 60 Hz i 90 Hz w jednym oraz 48 Hz i 72 Hz w innej grupie konfiguracji. Platforma wie, może przełączać się między 60 Hz i 90 Hz oraz między 48 Hz a 72 Hz, ale nie między 60 Hz i 72 Hz, ponieważ spowoduje to zmianę konfiguracji, a nie tylko częstotliwość odświeżania.


Aktualizacje interfejsu Composer API
- getDisplayVsyncPeriod.
- Większa kontrola i przewidywalność podczas zmiany częstotliwości odświeżania
Aplikacja
getDisplayVsyncPeriod
została dodana.getDisplayVsyncPeriod
zwraca bieżącą częstotliwość odświeżania (w ujęciu okres vsync), podczas którego 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 dotychczasowej metodysetActiveConfig
, które zawiera więcej informacji o zmianie konfiguracji. Ograniczenia są określone wvsyncPeriodChangeConstraints
i zawierają te parametry: . - desiredTimeNanos
- Czas w parametrze
CLOCK_MONOTONIC
, po którym może nastąpić okres vsync zmiana (czyli okres vsync nie może się zmienić przed tym okresem). 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 odpowiednio ustawia czas, by uwzględnić te bufory i upewnić się, że przejście z częstotliwością odświeżania będzie możliwie najpłynniejsze. - bez komplikacjiWymagane
- Jeśli ma wartość prawda, zmiana okresu vsync musi następować bezproblemowo
bez widocznego artefaktu wizualnego. Ten parametr jest używany przez platformę, gdy zmiana częstotliwości odświeżania jest wymagana w wyniku zmiany treści (np. gdy urządzenie jest nieaktywne, a animacja się rozpoczyna). 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ć kodSEAMLESS_NOT_POSSIBLE
jako kod zwracany i wywołać nową funkcję wywołania zwrotnegoonSeamlessPossible
, gdy można płynnie wprowadzić tę samą zmianę konfiguracji. Po udanym działaniu implementacja zwraca
VsyncPeriodChangeTimeline
, który informuje platformę o tym, kiedy się spodziewać zmiana częstotliwości odświeżania. ParametrynewVsyncAppliedTimeNanos
należy ustawić na wartość czasu wCLOCK_MONOTONIC
, kiedy nowy wyświetlacz zacznie odświeżać w nowym okresie vsync. To orazdesiredTimeNanos
umożliwia platformie planowanie odświeżenia z wyprzedzeniem przełącznik częstotliwości odświeżania i zacznij z wyprzedzeniem zaznaczać aplikacje, które korzystają z nowej 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 przed odświeżeniem stawki podatku. 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]
- Nowe wywołanie zwrotne, które może zostać wywołane przez HAL, aby wskazać platformie, że niektóre parametru osi czasu zmienił się i platforma musi dostosować swoją oś czasu. Ta funkcja jest wywoływana, jeśli z jakiegoś powodu nie udało się użyć starej linii czasowej 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?
Wybieranie częstotliwości odświeżania odbywa się w tych 2 usługach systemowych:
- DisplayManager
- Element
DisplayManager
określa ogólne zasady dotyczące częstotliwości odświeżania. Ustawia domyślną konfigurację wyświetlania, czyli taką samą jak konfigurację HAL kompozytora. Dodatkowo ustawia zakres minimalnych i maksymalnych wartości, któreSurfaceFlinger
można wybrać jako odświeżenie stawki. - SurfaceFlinger
- Określa częstotliwość odświeżania przez ustawienie konfiguracji w tej samej konfiguracji grupy jako konfigurację domyślną i z częstotliwością odświeżania w zakresie min./maks. zakres dat.
Menedżer sieci reklamowej wykonuje poniższe kroki, aby określić zasady:
- Znajduje identyfikator domyślnej konfiguracji, wysyłając zapytanie do aktywnej konfiguracji z adresu
SurfaceFlinger
- Ograniczenie zakresu wartości minimalnych i maksymalnych przez iterację
warunki systemu
- Domyślna częstotliwość 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ślania standardowej częstotliwości odświeżania animacji na urządzeniu. i dotyku. - 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 ustawiona w polu Nakładka 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
. Ta wartość może zostać zmienione w czasie działania, aby odzwierciedlić bieżące ustawienie urządzenia (np. 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 warunkówDisplayManager
ustawia domyślny identyfikator konfiguracji i ustawia minimalną i maksymalną częstotliwość odświeżania częstotliwość odświeżania danych. - Oszczędzanie baterii: częstotliwość odświeżania jest ograniczona do 60 Hz lub
zmniejsza się, gdy urządzenie działa w trybie oszczędzania energii, co jest wskazywane przez
Settings.Global.LOW_POWER_MODE.
- Domyślna częstotliwość odświeżania: domyślna wartość częstotliwości odświeżania.
jest ustawiana w nakładce konfiguracyjnej
Gdy DisplayManager
skonfiguruje zasadę,
SurfaceFlinger
ustawia częstotliwość odświeżania na podstawie aktywnych warstw (warstw dodanych do kolejki
aktualizacji ramek). 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 ustawiają liczbę klatek na 24 i 60, SurfaceFlinger
wybierze częstotliwość 120 Hz, jeśli jest dostępna. 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 programistó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 Częstotliwość odświeżania jest ustalana na podstawie aktywnych warstw, nawet jeśli nie ustawiono liczby klatek. SurfaceFlinger stosuje heurystyczny algorytm, który 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. Ta heurystyka ma na celu przygotowanie do domyślnej częstotliwości odświeżania ani animacji.ro.surface_flinger.set_idle_timer_ms
: jeśli > 0, minimalna częstotliwość odświeżania będzie używana, gdy nie ma aktualizacji ekranu w skonfigurowanym czasie oczekiwania.ro.surface_flinger.set_display_power_timer_ms
: jeśli wartość jest większa niż 0, podczas włączania wyświetlacza (lub gdy wyświetlacz przejdzie z trybu AOD) będzie używana domyślna częstotliwość odświeżania przez czas określony w czasie oczekiwania.
Interfejs Frame Rate API
Interfejs API liczby klatek pozwala aplikacjom na informowanie platformy Androida o zamierzonych z liczbą klatek i jest dostępny tylko w przypadku aplikacji, które Android 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.