Android 11 unterstützt Geräte mit mehreren Aktualisierungsraten. Dieses Feature 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
android.hardware.graphics.composer@2.4 HAL
bietet jetzt spezielle Unterstützung für das Umschalten der Aktualisierungsrate.
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
Dem Attribut IComposerClient::Attribute
wurde ein neues Attribut CONFIG_GROUP
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 Konfigurationsgruppe wird von der Plattform verwendet, 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 du von 60 Hz zu 72 Hz wechselst, ändert sich die Displaykonfiguration von 1080p zu 1080i. Das ist möglicherweise nicht das gewünschte Verhalten. Dieses Problem lässt sich mit Konfigurationsgruppen lösen. Dazu werden 60 Hz und 90 Hz in einer Konfigurationsgruppe und 48 Hz und 72 Hz in einer anderen Konfigurationsgruppe zusammengefasst. Die Plattform weiß, 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ühren würde.


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 zwischen Aktualisierungsraten gewechselt wird und die aktuelle Aktualisierungsrate von der Plattform benötigt wird, 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 darf (d. h. 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. Dieses Flag wird von der Plattform verwendet, wenn aufgrund einer Inhaltsänderung eine Änderung der Aktualisierungsrate erforderlich ist (z. B. wenn das Gerät im Leerlauf ist und eine Animation startet). 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. Zusammen mitdesiredTimeNanos
kann die Plattform so 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, der von der HAL aufgerufen werden 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. Es wird eine Standardanzeigekonfiguration festgelegt, 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 Ebenen 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.