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,
getDisplayVsyncPerioddodaliśmy funkcję.getDisplayVsyncPeriodzwraca 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
setActiveConfigWithConstraintsto nowe rozszerzenie istniejącej metodysetActiveConfig, które zawiera więcej informacji o zmianie konfiguracji. Ograniczenia są podawane jako część parametrówvsyncPeriodChangeConstraintsi 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
seamlessRequiredma wartośćtrue, implementacja powinna zwrócićSEAMLESS_NOT_POSSIBLEjako kod powrotu i wywołać nowe wywołanie zwrotneonSeamlessPossible, 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. ParametrynewVsyncAppliedTimeNanosnależy ustawić na czas wCLOCK_MONOTONIC, kiedy nowy wyświetlacz zacznie odświeżać z nowym okresem synchronizacji pionowej. W połączeniu zdesiredTimeNanosumoż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
refreshRequiredparametr, który wskazuje, że potrzebna jest klatka odświeżania, orazrefreshTimeNanosktó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
DisplayManagerustawia 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 dlaSurfaceFlingerdo 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 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 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.preferredDisplayModeIdaby odzwierciedlać preferowaną konfigurację, w której powinien działać wyświetlacz. W większości przypadków,DisplayManagerodpowiednio 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.
- Ustawienie domyślnej częstotliwości odświeżania: domyślna wartość częstotliwości odświeżania
jest ustawiana w nakładce konfiguracji
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.