Wiele częstotliwości odświeżania

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 metody setActiveConfig, które zawiera 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 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 to true, implementacja powinna zwrócić SEAMLESS_NOT_POSSIBLE jako kod zwracany i wywołać nową funkcję wywołania zwrotnego onSeamlessPossible, 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. Parametry newVsyncAppliedTimeNanos muszą być ustawione na czas w CLOCK_MONOTONIC, gdy nowy wyświetlacz zacznie odświeżać w nowym okresie vsync. Dzięki temu i funkcji desiredTimeNanos 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 parametr refreshTimeNanos, 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 parametru SurfaceFlinger, 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 konfiguracji R.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ó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: 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 ikonaSettings.Global.LOW_POWER_MODE.

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.