Wielokrotne odświeżanie

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 metody setActiveConfig, które zawiera więcej informacji o zmianie konfiguracji. Ograniczenia są określone w vsyncPeriodChangeConstraints 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 to true, implementacja powinna zwrócić kod 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 udanym działaniu implementacja zwraca VsyncPeriodChangeTimeline, który informuje platformę o tym, kiedy się spodziewać zmiana częstotliwości odświeżania. Parametry newVsyncAppliedTimeNanos należy ustawić na wartość czasu w CLOCK_MONOTONIC, kiedy nowy wyświetlacz zacznie odświeżać w nowym okresie vsync. To oraz desiredTimeNanos 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 parametr refreshTimeNanos, 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óre SurfaceFlinger 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 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. 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ów DisplayManager 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.

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.