Wiele częstotliwości odświeżania

Android 11 obsługuje urządzenia z wieloma częstotliwościami odświeżania. Ta funkcja ma 3 główne komponenty:

  • Nowe interfejsy API HAL 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 API pakietów SDK i NDK, które umożliwiają aplikacjom ustawianie żądanej liczby klatek

Implementacja

Dodaliśmy do niej specjalną obsługę przełączania częstotliwości odświeżania. 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 dodano nowy atrybut CONFIG_GROUP, który można wyszukiwać za pomocą interfejsu getDisplayAttribute_2_4 API. Ten atrybut umożliwia dostawcom grupowanie konfiguracji wyświetlaczy. Konfiguracje w tej samej grupie umożliwiają w większości przypadków płynne przełączanie się między nimi. Platforma używa grupy konfiguracji, aby odróżnić konfiguracje, między którymi można się 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 przy 60 Hz
  • 1080p przy 90 Hz
  • 1080i@72Hz
  • 1080i przy 48 Hz

Chociaż 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żądane. Grupy konfiguracji rozwiązują ten problem. Grupując 60 Hz i 90 Hz w jednej grupie konfiguracji, a 48 Hz i 72 Hz w innej, 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 zmianę 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 getDisplayVsyncPeriod. getDisplayVsyncPeriod zwraca bieżącą częstotliwość odświeżania (w okresie 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ąć kolejną klatkę.
setActiveConfigWithConstraints
Metoda setActiveConfigWithConstraints to nowe rozszerzenie istniejącej metody setActiveConfig, które dostarcza 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 pionowej może się zmienić (tzn. okres synchronizacji pionowej nie może się zmienić przed tym czasem). Jest to przydatne, gdy platforma chce zaplanować zmianę częstotliwości odświeżania, ale w kolejce ma już buforowane dane do wyświetlenia. Platforma odpowiednio dostosowuje ten czas, aby uwzględnić te bufory i zapewnić jak najpłynniejsze przejście do nowej częstotliwości odświeżania.
    seamlessRequired
    Jeśli wartość to „true”, zmiana okresu synchronizacji pionowej musi nastąpić płynnie, bez widocznych artefaktów. Platforma używa tej flagi, gdy zmiana częstotliwości odświeżania jest potrzebna w wyniku zmiany treści (np. urządzenie jest w stanie bezczynności i rozpoczyna się animacja). Dzięki temu dostawca może zablokować określone zmiany konfiguracji, jeśli mogą one spowodować zauważalne artefakty wizualne. Jeśli konfiguracji nie można zmienić bezproblemowo, a wartość parametru seamlessRequired to true, implementacja powinna zwrócić kod SEAMLESS_NOT_POSSIBLE i wywołać nowy wywołanie zwrotne onSeamlessPossible, gdy tę samą zmianę konfiguracji będzie można wprowadzić bezproblemowo.

W przypadku powodzenia implementacja zwraca wartość VsyncPeriodChangeTimeline, która informuje platformę, kiedy należy się spodziewać zmiany częstotliwości odświeżania. newVsyncAppliedTimeNanos parametry muszą być ustawione na czas w CLOCK_MONOTONIC, w którym nowy wyświetlacz zacznie odświeżać się z nowym okresem synchronizacji pionowej. To w połączeniu z desiredTimeNanos umożliwia platformie wcześniejsze zaplanowanie zmiany częstotliwości odświeżania i wcześniejsze rozpoczęcie odświeżania aplikacji z nową częstotliwością. Umożliwia to płynną zmianę częstotliwości odświeżania.

Niektóre implementacje wymagają wysłania klatki odświeżania przed wysłaniem częstotliwości odświeżania. W tym celu HAL ma parametr refreshRequired, który wskazuje, że wymagana jest klatka odświeżania, oraz parametr refreshTimeNanos, który wskazuje pierwszy sygnał VSYNC, po którym 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ę 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óźnionego odświeżania klatki.

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
DisplayManagerOkreśla 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 dla SurfaceFlinger, które można wybrać 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.

Menedżer wyświetlania wykonuje te czynności, aby określić zasady:

  • Znajduje domyślny identyfikator konfiguracji, wysyłając zapytanie o aktywną konfigurację z SurfaceFlinger
  • Ograniczanie zakresu wartości minimalnych i maksymalnych przez iterowanie po warunkach systemowych.
    • Domyślne ustawienie 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. opcję menu). Wartość domyślna jest ustawiona w nakładce konfiguracyjnej R.integer.config_defaultPeakRefreshRate.
    • Ustawienie minimalnej częstotliwości odświeżania: minimalna częstotliwość odświeżania jest odczytywana z Settings.System.MIN_REFRESH_RATE. Tę wartość można zmienić w czasie działania programu, aby odzwierciedlała bieżące ustawienie urządzenia (np. za pomocą opcji menu). Wartość domyślna to 0, więc nie ma domyślnego minimum.
    • Identyfikator trybu żądany przez aplikację: aplikacje mogą ustawić WindowManager.LayoutParams.preferredDisplayModeId, aby odzwierciedlać preferowaną konfigurację, w której powinien 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 mniej, gdy urządzenie jest w trybie niskiego zużycia energii, co jest sygnalizowane przez ikonę Settings.Global.LOW_POWER_MODE..

Gdy DisplayManager ustawi zasadę,SurfaceFlinger ustawi częstotliwość odświeżania na podstawie aktywnych warstw (warstw, które kolejkuje aktualizacje klatek). Jeśli właściciel warstwy ustawi liczbę klatek na sekundę, SurfaceFlinger próbuje ustawić częstotliwość odświeżania na wartość, która jest wielokrotnością tej liczby. Jeśli na przykład 2 aktywne warstwy ustawią częstotliwość odświeżania na 24 i 60 klatek na sekundę, SurfaceFlinger wybierze 120 Hz, jeśli jest dostępna. Jeśli taka częstotliwość odświeżania nie jest dostępna dla SurfaceFlingera, spróbuje on wybrać częstotliwość odświeżania, która ma najmniejszy błąd w przypadku liczby klatek na sekundę. Więcej informacji znajdziesz w dokumentacji dla deweloperów na 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ę, która 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 wartość jest większa od 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 zapewnić domyślną częstotliwość 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 nie ma aktualizacji ekranu przez skonfigurowany czas oczekiwania.
  • ro.surface_flinger.set_display_power_timer_ms: jeśli wartość jest większa od 0, domyślna częstotliwość odświeżania będzie używana po włączeniu wyświetlacza (lub po wyjściu z trybu zawsze włączonego) przez skonfigurowany czas oczekiwania.

Frame Rate API

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

Opcje programisty

Do menu dodano nową opcję programisty, która włą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.