Android 11 unterstützt Geräte mit mehreren Aktualisierungsraten. Diese Funktion besteht aus drei Hauptkomponenten:
- Neue HAL-APIs, die in
android.hardware.graphics.composer@2.4
eingeführt wurden. - Plattformcode zum Parsen von Gerätekonfigurationen für verschiedene Aktualisierungsraten und zum Festlegen der gewünschten Aktualisierungsrate
- Neue SDK- und NDK-APIs, mit denen Apps ihre gewünschte Framerate festlegen können
Implementierung
Die Unterstützung für das Umschalten der Aktualisierungsrate wurde in … hinzugefügt. Wir empfehlen dringend, diese Version zu verwenden, da frühere Versionen des Composer-HAL nur eingeschränkte Unterstützung für das Umschalten der Aktualisierungsrate bieten.
Konfigurationsgruppen
Ein neues Attribut, CONFIG_GROUP
, wurde IComposerClient::Attribute
hinzugefügt, das mit der getDisplayAttribute_2_4
API abgefragt werden kann. Mit diesem Attribut können Anbieter Displaykonfigurationen gruppieren. Konfigurationen in derselben Gruppe ermöglichen in den meisten Fällen einen nahtlosen Wechsel zwischen ihnen. Die Plattform verwendet die Konfigurationsgruppe, um zu unterscheiden, zwischen welchen Konfigurationen gewechselt werden kann, um die Aktualisierungsrate und nicht andere Attribute für eine Konfiguration zu ändern.
Das folgende Beispiel veranschaulicht die Vorteile der Verwendung von Konfigurationsgruppen mit einem Gerät, das vier Displaykonfigurationen unterstützt:
- 1080p bei 60 Hz
- 1080p bei 90 Hz
- 1080i bei 72 Hz
- 1080i bei 48 Hz
Obwohl das Gerät Bildwiederholraten von 48 Hz, 60 Hz, 72 Hz und 90 Hz unterstützt, wird das Display in einem anderen Modus betrieben. Wenn Sie von 60 Hz zu 72 Hz wechseln, ändert sich die Displaykonfiguration von 1080p zu 1080i. Das ist möglicherweise nicht das gewünschte Verhalten. Konfigurationsgruppen bieten hier eine Lösung. Wenn Sie 60 Hz und 90 Hz in einer Konfigurationsgruppe und 48 Hz und 72 Hz in einer anderen Konfigurationsgruppe zusammenfassen, weiß die Plattform, dass sie zwischen 60 Hz und 90 Hz sowie zwischen 48 Hz und 72 Hz wechseln kann, aber nicht zwischen 60 Hz und 72 Hz, da dies zu einer Konfigurationsänderung und nicht nur zu einer Änderung der Aktualisierungsrate führt.


Composer API-Updates
- getDisplayVsyncPeriod
- Für eine bessere Kontrolle und Vorhersagbarkeit beim Ändern der Aktualisierungsraten wurde
getDisplayVsyncPeriod
hinzugefügt.getDisplayVsyncPeriod
gibt die aktuelle Aktualisierungsrate (in Bezug auf den VSync-Zeitraum) des Displays zurück. Das ist besonders nützlich, wenn die Aktualisierungsrate geändert wird und die Plattform die aktuelle Aktualisierungsrate benötigt, um zu entscheiden, wann der nächste Frame gestartet werden soll. - setActiveConfigWithConstraints
- Die Methode
setActiveConfigWithConstraints
ist eine neue Erweiterung der vorhandenen MethodesetActiveConfig
und enthält weitere Informationen zur Konfigurationsänderung. Die Einschränkungen werden als Teil dervsyncPeriodChangeConstraints
-Parameter angegeben und enthalten die folgenden Parameter. - desiredTimeNanos
- Die Zeit in
CLOCK_MONOTONIC
, nach der sich der VSync-Zeitraum ändern kann. Das heißt, der VSync-Zeitraum darf sich vor dieser Zeit nicht ändern. Das ist nützlich, wenn die Plattform eine Änderung der Aktualisierungsrate planen möchte, aber bereits einige Puffer in der Warteschlange hat, die präsentiert werden können. Die Plattform legt diese Zeit entsprechend fest, um diese Puffer zu berücksichtigen und sicherzustellen, dass der Übergang der Aktualisierungsrate so reibungslos wie möglich erfolgt. - seamlessRequired
- Wenn „true“, muss die Änderung des VSync-Zeitraums nahtlos und ohne sichtbare Artefakte erfolgen. Die Plattform verwendet dieses Flag, wenn aufgrund einer Änderung des Inhalts eine Änderung der Aktualisierungsrate erforderlich ist (z. B. wenn das Gerät im Leerlauf ist und eine Animation beginnt). So kann der Anbieter bestimmte Konfigurationsänderungen verhindern, wenn sie zu sichtbaren visuellen Artefakten führen könnten. Wenn die Konfigurationen nicht nahtlos geändert werden können und
seamlessRequired
auftrue
festgelegt ist, wird erwartet, dass die ImplementierungSEAMLESS_NOT_POSSIBLE
als Rückgabecode zurückgibt und den neuenonSeamlessPossible
-Callback aufruft, wenn dieselbe Konfigurationsänderung nahtlos erfolgen kann. Bei Erfolg gibt die Implementierung ein
VsyncPeriodChangeTimeline
zurück, das der Plattform mitteilt, wann die Änderung der Aktualisierungsrate erwartet wird. DienewVsyncAppliedTimeNanos
-Parameter müssen auf die Zeit inCLOCK_MONOTONIC
festgelegt werden, zu der das neue Display mit dem neuen V‑Sync-Zeitraum aktualisiert wird. In Kombination mitdesiredTimeNanos
kann die Plattform den Wechsel der Aktualisierungsrate im Voraus planen und Apps für die neue Aktualisierungsrate im Voraus ticken. Dadurch ist ein nahtloser Übergang der Aktualisierungsrate möglich.Bei einigen Implementierungen muss ein Aktualisierungs-Frame gesendet werden, bevor die Aktualisierungsrate gesendet werden kann. Dazu hat der HAL den Parameter
refreshRequired
, um anzugeben, dass ein Aktualisierungs-Frame erforderlich ist, undrefreshTimeNanos
, um den ersten V-Sync anzugeben, nach dem ein Aktualisierungs-Frame gesendet werden muss.- onVsyncPeriodTimingChanged [callback]
- Ein neuer Callback, den die HAL aufrufen kann, um der Plattform mitzuteilen, dass sich ein Parameter der Zeitachse geändert hat und die Plattform ihre Zeitachse anpassen muss. Dieser Callback wird erwartet, wenn die alte Zeitachse aus irgendeinem Grund aufgrund einer langen Verarbeitungszeit auf dem HAL oder eines späten Aktualisierungs-Frames nicht berücksichtigt wurde.
Wie entscheidet die Plattform, die Aktualisierungsrate zu ändern?
Die Auswahl der Aktualisierungsrate erfolgt in den folgenden beiden Systemdiensten:
- DisplayManager
- Mit
DisplayManager
wird die Richtlinie auf hoher Ebene für die Aktualisierungsrate festgelegt. Sie legt eine Standardanzeigekonfiguration fest, die mit der Composer-HAL-Konfiguration identisch ist. Außerdem wird ein Bereich mit Mindest- und Höchstwerten fürSurfaceFlinger
festgelegt, aus denen die Aktualisierungsrate ausgewählt werden kann. - SurfaceFlinger
- Bestimmt die Aktualisierungsrate, indem eine Konfiguration festgelegt wird, die sich in derselben Konfigurationsgruppe wie die Standardkonfiguration befindet und deren Aktualisierungsrate innerhalb des Mindest-/Maximalbereichs liegt.
Der Display Manager führt die folgenden Schritte aus, um die Richtlinie zu ermitteln:
- Ruft die Standardkonfigurations-ID ab, indem die aktive Konfiguration aus
SurfaceFlinger
abgefragt wird. - Einschränken des Bereichs von Mindest- und Höchstwerten durch Iterieren über die Systembedingungen
- Standardeinstellung für die Aktualisierungsrate: Der Standardwert für die Aktualisierungsrate wird im Konfigurations-Overlay
R.integer.config_defaultRefreshRate
festgelegt. Dieser Wert wird verwendet, um die Standardaktualisierungsrate des Geräts für Animationen und Touch-Interaktionen zu bestimmen. - Einstellung für die maximale Aktualisierungsrate: Der Wert für die maximale Aktualisierungsrate wird aus
Settings.System.PEAK_REFRESH_RATE
gelesen. Dieser Wert wird zur Laufzeit geändert, um die aktuelle Geräteeinstellung widerzuspiegeln (z. B. über eine Menüoption). Der Standardwert wird im Konfigurations-OverlayR.integer.config_defaultPeakRefreshRate
festgelegt. - Einstellung für die Mindestaktualisierungsrate: Der Wert für die Mindestaktualisierungsrate wird aus
Settings.System.MIN_REFRESH_RATE
gelesen. Dieser Wert kann zur Laufzeit geändert werden, um die aktuelle Geräteeinstellung widerzuspiegeln (z. B. über eine Menüoption). Der Standardwert ist 0, es gibt also kein Standardminimum. - Von der Anwendung angeforderte ModeId: Apps können
WindowManager.LayoutParams.preferredDisplayModeId
festlegen, um eine bevorzugte Konfiguration anzugeben, in der das Display betrieben werden soll. Unter den meisten Bedingungen wird mitDisplayManager
die Standardkonfigurations-ID entsprechend festgelegt und die Mindest- und Höchstaktualisierungsrate an die Aktualisierungsrate der Konfiguration angepasst. - Energiesparmodus: Die Aktualisierungsrate ist auf 60 Hz oder weniger begrenzt, wenn sich das Gerät im Energiesparmodus befindet. Dies wird durch
Settings.Global.LOW_POWER_MODE.
angezeigt.
- Standardeinstellung für die Aktualisierungsrate: Der Standardwert für die Aktualisierungsrate wird im Konfigurations-Overlay
Sobald DisplayManager
die Richtlinie festlegt, legt SurfaceFlinger
die Aktualisierungsrate basierend auf den aktiven Layern fest (Layern, die Frame-Updates in die Warteschlange stellen). Wenn der Eigentümer der Ebene eine Bildrate festlegt, versucht SurfaceFlinger, die Aktualisierungsrate auf einen Wert festzulegen, der ein Vielfaches dieser Rate ist.
Wenn beispielsweise zwei aktive Ebenen ihre Framerate auf 24 und 60 fps festlegen, wählt SurfaceFlinger 120 Hz aus, sofern verfügbar. Wenn eine solche Aktualisierungsrate für SurfaceFlinger nicht verfügbar ist, wird versucht, die Aktualisierungsrate mit dem geringsten Fehler für die Framerate auszuwählen. Weitere Informationen finden Sie in der Entwicklerdokumentation unter developer.android.com.
SurfaceFlinger
verwendet die folgenden Flags, um zu steuern, wie die Aktualisierungsrate festgelegt wird:
ro.surface_flinger.use_content_detection_for_refresh_rate:
Wenn festgelegt, wird die Aktualisierungsrate basierend auf den aktiven Layern bestimmt, auch wenn keine Framerate festgelegt wurde. SurfaceFlinger verwendet eine Heuristik, um die durchschnittliche Anzahl von Bildern pro Sekunde zu ermitteln, mit der der Layer Puffer postet. Dazu wird der dem Puffer angehängte Präsentationszeitstempel betrachtet.ro.surface_flinger.set_touch_timer_ms
: Wenn > 0, wird die Standardaktualisierungsrate verwendet, wenn ein Nutzer den Bildschirm für das konfigurierte Zeitlimit berührt. Diese Heuristik wird verwendet, um die Standardaktualisierungsrate für Animationen festzulegen.ro.surface_flinger.set_idle_timer_ms
: Wenn > 0, wird die minimale Aktualisierungsrate verwendet, wenn für das konfigurierte Zeitlimit keine Bildschirmaktualisierungen erfolgen.ro.surface_flinger.set_display_power_timer_ms
: Wenn > 0, wird die Standardaktualisierungsrate beim Einschalten des Displays (oder beim Beenden des AOD) für das konfigurierte Zeitlimit verwendet.
Frame Rate API
Mit der Framerate-API können Apps die Android-Plattform über ihre beabsichtigte Framerate informieren. Sie ist für Apps verfügbar, die auf Android 11 ausgerichtet sind. Weitere Informationen zur Frame Rate API finden Sie in der Entwicklerdokumentation auf developer.android.com.
Entwickleroptionen

Dem Menü wurde eine neue Entwickleroption hinzugefügt, mit der ein Overlay auf dem Display mit der aktuellen Aktualisierungsrate ein- und ausgeblendet werden kann. Die neue Option befindet sich unter Einstellungen > System > Entwickleroptionen > Aktualisierungsrate anzeigen.