Android 11 bietet Unterstützung für Geräte mit mehreren Bildwiederholraten. Diese Funktion besteht aus drei Hauptkomponenten:
- Neue HAL-APIs eingeführt in
android.hardware.graphics.composer@2.4
. - Plattformcode zum Parsen von Gerätekonfigurationen für unterschiedliche Aktualisierungsraten und zum Festlegen der gewünschten Aktualisierungsrate
- Neue SDK- und NDK-APIs, mit denen Apps ihre gewünschte Bildrate festlegen können
Implementierung
Spezielle Unterstützung für die Umschaltung der Bildwiederholfrequenz wurde zu android.hardware.graphics.composer@2.4 HAL
hinzugefügt. Wir empfehlen dringend, diese Version zu verwenden, da frühere Versionen von Composer HAL die Umschaltung der Bildwiederholfrequenz nur begrenzt unterstützen.
Konfigurationsgruppen
IComposerClient::Attribute
wurde ein neues Attribut CONFIG_GROUP
hinzugefügt, das mithilfe der getDisplayAttribute_2_4
API abgefragt werden kann. Mit diesem Attribut können Anbieter Anzeigekonfigurationen 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, welche Konfigurationen zwischen ihnen umgeschaltet werden können, um die Aktualisierungsrate und nicht andere Attribute für eine Konfiguration umzuschalten.
Betrachten Sie das folgende Beispiel, das die Vorteile der Verwendung von Konfigurationsgruppen mit einem Gerät zeigt, das vier Anzeigekonfigurationen unterstützt:
- 1080p@60Hz
- 1080p@90Hz
- 1080i@72Hz
- 1080i@48Hz
Obwohl das Gerät Bildwiederholfrequenzen von 48 Hz, 60 Hz, 72 Hz und 90 Hz unterstützt, arbeitet das Display in einem anderen Modus und beim Wechsel von 60 Hz auf 72 Hz ändert sich die Displaykonfiguration von 1080p auf 1080i, was möglicherweise nicht das gewünschte Verhalten ist. Dies wird durch die Verwendung von Konfigurationsgruppen gelöst. Durch Gruppieren von 60 Hz und 90 Hz in einer Konfigurationsgruppe und 48 Hz und 72 Hz in einer anderen Konfigurationsgruppe. Die Plattform weiß, dass sie zwischen 60 Hz und 90 Hz und zwischen 48 Hz und 72 Hz wechseln kann, jedoch nicht zwischen 60 Hz und 72 Hz, da dies zu einer Konfigurationsänderung und nicht nur zu einer Änderung der Bildwiederholfrequenz führt.
Composer-API-Updates
- getDisplayVsyncPeriod
- Für eine bessere Kontrolle und Vorhersehbarkeit beim Ändern der Bildwiederholfrequenz wurde
getDisplayVsyncPeriod
hinzugefügt.getDisplayVsyncPeriod
gibt die aktuelle Aktualisierungsrate (in Bezug auf die Vsync-Periode) zurück, mit der das Display arbeitet. Dies ist besonders nützlich, wenn die Plattform einen Übergang zwischen der Bildwiederholfrequenz und der aktuellen Bildwiederholfrequenz benötigt, um zu entscheiden, wann mit dem nächsten Frame begonnen werden soll. - setActiveConfigWithConstraints
- Die
setActiveConfigWithConstraints
Methode ist eine neue Erweiterung der vorhandenensetActiveConfig
Methode und bietet weitere Informationen zur Konfigurationsänderung. Die Einschränkungen werden als Teil dervsyncPeriodChangeConstraints
-Parameter angegeben und enthalten die folgenden Parameter. - gewünschteZeitNanos
- Die Zeit in
CLOCK_MONOTONIC
, nach der sich der Vsync-Zeitraum ändern kann (d. h. der Vsync-Zeitraum darf sich vor diesem Zeitpunkt nicht ändern). Dies ist nützlich, wenn die Plattform eine Änderung der Bildwiederholfrequenz im Voraus planen möchte, aber bereits einige Puffer in der Warteschlange zur Verfügung stehen. Die Plattform legt diese Zeit entsprechend fest, um diese Puffer zu berücksichtigen und sicherzustellen, dass der Übergang der Bildwiederholfrequenz so reibungslos wie möglich verläuft. - nahtlosErforderlich
- Wenn „true“, ist es erforderlich, dass die Änderung des Vsync-Zeitraums nahtlos und ohne erkennbare visuelle Artefakte erfolgen muss. 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 die Animation beginnt). Dies gibt dem Anbieter die Möglichkeit, bestimmte Konfigurationsänderungen nicht zuzulassen, wenn sie zu einem auffälligen visuellen Artefakt führen könnten. Wenn die Konfigurationen nicht nahtlos geändert werden können und
seamlessRequired
auftrue
gesetzt ist, wird von der Implementierung erwartet, dass sieSEAMLESS_NOT_POSSIBLE
als Rückgabecode zurückgibt und den neuenonSeamlessPossible
Rückruf aufruft, wenn dieselbe Konfigurationsänderung nahtlos durchgeführt werden kann. Bei Erfolg gibt die Implementierung eine
VsyncPeriodChangeTimeline
zurück, die der Plattform mitteilt, wann mit der Änderung der Aktualisierungsrate zu rechnen ist.newVsyncAppliedTimeNanos
-Parameter müssen auf die Zeit inCLOCK_MONOTONIC
eingestellt werden, zu der die neue Anzeige mit der Aktualisierung im neuen Vsync-Zeitraum beginnt. Dies ermöglicht es der Plattform zusammen mitdesiredTimeNanos
, den Wechsel der Bildwiederholfrequenz im Voraus zu planen und im Voraus damit zu beginnen, Apps für die neue Bildwiederholfrequenz anzukreuzen. Dies ermöglicht einen nahtlosen Übergang der Bildwiederholfrequenz.Bei einigen Implementierungen muss ein Aktualisierungsrahmen gesendet werden, bevor die Aktualisierungsrate gesendet werden kann. Zu diesem Zweck verfügt die HAL über den Parameter
refreshRequired
, um anzugeben, dass ein Aktualisierungsrahmen erforderlich ist, undrefreshTimeNanos
“, um den ersten Vsync anzugeben, nach dem ein Aktualisierungsrahmen gesendet werden muss.- onVsyncPeriodTimingChanged [Rückruf]
- Ein neuer Rückruf, der von der HAL aufgerufen werden kann, um der Plattform mitzuteilen, dass sich ein Parameter der Zeitleiste geändert hat und die Plattform ihre Zeitleiste anpassen muss. Es wird erwartet, dass dieser Rückruf aufgerufen wird, wenn aus irgendeinem Grund die alte Zeitleiste aufgrund einer langen Verarbeitungszeit auf dem HAL oder eines späten Aktualisierungsrahmens verpasst wurde.
Wie entscheidet die Plattform, die Bildwiederholfrequenz zu ändern?
Die Auswahl der Bildwiederholfrequenz erfolgt in den folgenden zwei Systemdiensten:
- Bildschirm Manager
- Der
DisplayManager
legt die allgemeine Richtlinie rund um die Bildwiederholfrequenz fest. Es legt eine Standardanzeigekonfiguration fest, die mit der Composer-HAL-Konfiguration identisch ist. Darüber hinaus legt es einen Bereich von Mindest- und Höchstwerten fest, dieSurfaceFlinger
als Aktualisierungsrate auswählen kann. - SurfaceFlinger
- Bestimmt die Aktualisierungsrate durch Festlegen einer Konfiguration, die sich in derselben Konfigurationsgruppe wie die Standardkonfiguration befindet und eine Aktualisierungsrate im Min.-/Max.-Bereich aufweist.
Der Display Manager durchläuft die folgenden Schritte, um die Richtlinie zu bestimmen:
- Findet die Standardkonfigurations-ID, indem die aktive Konfiguration von
SurfaceFlinger
abgefragt wird - Einschränkung des Bereichs von Minimal- und Maximalwerten durch Iteration über die Systembedingungen
- Standardeinstellung für die Aktualisierungsrate : Der Standardwert für die Aktualisierungsrate wird im
R.integer.config_defaultRefreshRate
-Konfigurationsoverlay festgelegt. Dieser Wert wird verwendet, um die Standardaktualisierungsrate des Geräts für Animationen und Berührungsinteraktionen zu bestimmen. - Einstellung der Spitzenaktualisierungsrate : Der Wert der Spitzenaktualisierungsrate 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 imR.integer.config_defaultPeakRefreshRate
-Konfigurationsoverlay festgelegt. - Einstellung der minimalen Aktualisierungsrate : Der Wert der minimalen Aktualisierungsrate 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, daher gibt es kein Standardminimum. - Von der Anwendung angeforderte ModeId : Apps können
WindowManager.LayoutParams.preferredDisplayModeId
festlegen, um eine bevorzugte Konfiguration widerzuspiegeln, mit der die Anzeige betrieben werden soll. In den meisten Fällen legt derDisplayManager
die Standardkonfigurations-ID entsprechend fest und stellt die minimale und maximale Aktualisierungsrate so ein, dass sie mit der Aktualisierungsrate der Konfiguration übereinstimmt. - Batteriesparmodus : Die Bildwiederholfrequenz ist auf 60 Hz oder weniger beschränkt, wenn sich das Gerät im Energiesparmodus befindet, was über
Settings.Global.LOW_POWER_MODE.
- Standardeinstellung für die Aktualisierungsrate : Der Standardwert für die Aktualisierungsrate wird im
Sobald DisplayManager
die Richtlinie festlegt, legt SurfaceFlinger
die Aktualisierungsrate basierend auf den aktiven Ebenen (Ebenen, die Frame-Aktualisierungen in die Warteschlange stellen) fest. Wenn der Eigentümer der Ebene eine Bildrate festlegt, versucht SurfaceFlinger, die Aktualisierungsrate auf einen Multiplikator dieser Rate festzulegen. Wenn beispielsweise zwei aktive Ebenen ihre Bildrate auf 24 und 60 einstellen, wählt SurfaceFlinger 120 Hz aus, sofern verfügbar. Wenn eine solche Aktualisierungsrate für SurfaceFlinger nicht verfügbar ist, wird versucht, die Aktualisierungsrate auszuwählen, die den minimalen Fehler für die Bildrate aufweist. Weitere Informationen finden Sie in der Entwicklerdokumentation auf Developer.android.com
SurfaceFlinger
verwaltet 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 festgelegt, auch wenn keine Bildrate festgelegt wurde. SurfaceFlinger unterhält eine Heuristik, bei der es die durchschnittlichen fps ermittelt, die die Ebene in den Puffern postet, indem es sich den an den Puffer angehängten Präsentationszeitstempel ansieht. -
ro.surface_flinger.set_touch_timer_ms
: Wenn > 0, wird die Standardaktualisierungsrate verwendet, wenn ein Benutzer den Bildschirm für das konfigurierte Timeout berührt. Diese Heuristik wird durchgeführt, um mit der Standardaktualisierungsrate für Animationen bereit zu sein. -
ro.surface_flinger.set_idle_timer_ms
: Wenn > 0, wird die minimale Aktualisierungsrate verwendet, wenn für das konfigurierte Timeout keine Bildschirmaktualisierungen vorliegen. -
ro.surface_flinger.set_display_power_timer_ms
: Wenn > 0, wird die Standardaktualisierungsrate beim Einschalten des Displays (oder beim Verlassen des AOD) für das konfigurierte Timeout verwendet.
Framerate-API
Mit der Framerate-API können Apps die Android-Plattform über ihre beabsichtigte Framerate informieren und sind für Apps verfügbar, die auf Android 11 abzielen. Weitere Informationen zur Framerate-API finden Sie in der Entwicklerdokumentation auf Developer.android.com .
Entwickleroptionen
Dem Menü wurde eine neue Entwickleroption hinzugefügt, die eine Überlagerung auf dem Display mit der aktuellen Bildwiederholfrequenz ein- und ausschaltet. Die neue Option finden Sie unter Einstellungen > System > Entwickleroptionen > Aktualisierungsrate anzeigen.