Android 11 unterstützt Geräte mit mehreren Bildwiederholraten. 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 Bildwiederholraten und Festlegen der gewünschten Bildwiederholrate
- Neue SDK- und NDK-APIs, mit denen Apps die gewünschte Framerate festlegen können
Implementierung
Für android.hardware.graphics.composer@2.4 HAL
wurde eine spezielle Unterstützung für die Umschaltung der Bildwiederholrate hinzugefügt.
Wir empfehlen dringend, diese Version zu verwenden, da frühere Versionen von composer HAL die Umschaltung der Bildwiederholrate nur eingeschränkt unterstützen.
Konfigurationsgruppen
IComposerClient::Attribute
wurde das neue Attribut CONFIG_GROUP
hinzugefügt, das über die 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. Anhand der Konfigurationsgruppe wird auf der Plattform unterschieden, zwischen welchen Konfigurationen gewechselt werden kann, um die Bildwiederholrate und nicht andere Attribute für eine Konfiguration zu ändern.
Im folgenden Beispiel werden die Vorteile der Verwendung von Konfigurationsgruppen mit einem Gerät veranschaulicht, 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 die Bildwiederholraten 48 Hz, 60 Hz, 72 Hz und 90 Hz unterstützt, arbeitet das Display in einem anderen Modus. Wenn Sie von 60 Hz auf 72 Hz umstellen, ändert sich die Displaykonfiguration von 1080p zu 1080i. Das ist möglicherweise nicht das gewünschte Verhalten. Mithilfe von Konfigurationsgruppen lässt sich dieses Problem lösen. indem Sie 60 Hz und 90 Hz in einer Konfigurationsgruppe und 48 Hz und 72 Hz in einer anderen Konfigurationsgruppe gruppieren. Die Plattform weiß, dass sie zwischen 60 Hz und 90 Hz und zwischen 48 Hz und 72 Hz, aber nicht zwischen 60 Hz und 72 Hz wechseln kann, da dies zu einer Konfigurationsänderung und nicht nur zu einer Änderung der Aktualisierungsrate führt.
Updates zur Composer API
- getDisplayVsyncPeriod
- Für eine bessere Kontrolle und Planbarkeit beim Ändern der Bildwiederholraten wurde
getDisplayVsyncPeriod
hinzugefügt.getDisplayVsyncPeriod
gibt die aktuelle Bildwiederholrate (in Bezug auf den VSync-Takt) zurück, mit der das Display betrieben wird. Das ist besonders nützlich, wenn die Plattform beim Wechsel zwischen den Bildwiederholraten die aktuelle Bildwiederholrate 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 bietet mehr Informationen zur Konfigurationsänderung. Die Einschränkungen sind Teil dervsyncPeriodChangeConstraints
-Parameter und enthalten die folgenden Parameter. - desiredTimeNanos
- Die Zeit in
CLOCK_MONOTONIC
, nach der sich die vsync-Periode ändern darf (d. h. die vsync-Periode darf sich vor dieser Zeit nicht ändern). Das ist nützlich, wenn die Plattform eine Änderung der Bildwiederholrate planen möchte, aber bereits einige Puffer in der Warteschlange hat, die präsentiert werden müssen. Die Plattform legt diese Zeit entsprechend fest, um diese Puffer zu berücksichtigen und dafür zu sorgen, dass der Wechsel der Aktualisierungsrate so reibungslos wie möglich verläuft. - Lückenlos erforderlich
- Wenn „wahr“, muss die Änderung der vsync-Periode nahtlos und ohne merkliche visuelle Artefakte erfolgen. Dieses Flag wird von der Plattform verwendet, wenn aufgrund einer Inhaltsänderung eine Änderung der Bildwiederholrate erforderlich ist (z. B. wenn das Gerät inaktiv ist und eine Animation gestartet wird). So kann der Anbieter bestimmte Konfigurationsänderungen verhindern, die zu einem deutlichen visuellen Artefakt führen könnten. Wenn die Konfigurationen nicht nahtlos geändert werden können und
seamlessRequired
auftrue
festgelegt ist, sollte die ImplementierungSEAMLESS_NOT_POSSIBLE
als Rückgabecode zurückgeben und den neuenonSeamlessPossible
-Callback aufrufen, wenn dieselbe Konfigurationsänderung nahtlos durchgeführt werden kann. Bei Erfolg gibt die Implementierung ein
VsyncPeriodChangeTimeline
zurück, das der Plattform mitteilt, wann die Änderung der Bildwiederholrate erfolgen soll. DienewVsyncAppliedTimeNanos
-Parameter müssen auf die Zeit inCLOCK_MONOTONIC
festgelegt werden, zu der das neue Display mit dem neuen vsync-Zeitraum aktualisiert wird. Zusammen mitdesiredTimeNanos
kann die Plattform so die Umstellung der Aktualisierungsrate im Voraus planen und Apps für die neue Aktualisierungsrate aktivieren. Dadurch ist ein nahtloser Übergang der Aktualisierungsrate möglich.Bei einigen Implementierungen muss ein Aktualisierungsframe gesendet werden, bevor die Aktualisierungsrate gesendet werden kann. Dazu gibt es in der HAL den Parameter
refreshRequired
, um anzugeben, dass ein Aktualisierungsframe erforderlich ist, undrefreshTimeNanos
, um den ersten vsync anzugeben, nach dem ein Aktualisierungsframe gesendet werden muss.- onVsyncPeriodTimingChanged [callback]
- Ein neuer Rückruf, 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 Rückruf wird voraussichtlich aufgerufen, wenn die alte Zeitachse aus irgendeinem Grund verpasst wurde, z. B. aufgrund einer langen Verarbeitungszeit auf der HAL oder eines späten Aktualisierungsframes.
Wie entscheidet die Plattform, die Aktualisierungsrate zu ändern?
Die Auswahl der Bildwiederholrate erfolgt in den folgenden beiden Systemdiensten:
- Anzeigemanager
- Mit
DisplayManager
wird die allgemeine Richtlinie für die Aktualisierungsrate festgelegt. Es wird eine Standardanzeigekonfiguration festgelegt, die mit der HAL-Konfiguration von Composer identisch ist. Außerdem wird ein Bereich mit Mindest- und Höchstwerten fürSurfaceFlinger
festgelegt, der als Aktualisierungsrate ausgewählt werden kann. - SurfaceFlinger
- Bestimmt die Aktualisierungsrate. Dazu wird eine Konfiguration festgelegt, die sich in derselben Konfigurationsgruppe wie die Standardkonfiguration befindet und eine Aktualisierungsrate innerhalb des Mindest-/Maximalbereichs hat.
Der Displaymanager führt die folgenden Schritte aus, um die Richtlinie zu ermitteln:
- Die Standardkonfigurations-ID wird durch Abfragen der aktiven Konfiguration von
SurfaceFlinger
ermittelt. - Begrenzung des Bereichs der Mindest- und Höchstwerte durch Iteration über die Systembedingungen
- Standardeinstellung für die Bildwiederholrate: Der Standardwert für die Bildwiederholrate wird im Konfigurations-Overlay von
R.integer.config_defaultRefreshRate
festgelegt. Mit diesem Wert wird die Standardaktualisierungsrate des Geräts für Animationen und Touch-Interaktionen bestimmt. - Einstellung für die maximale Aktualisierungsrate: Der Wert für die maximale Aktualisierungsrate wird aus
Settings.System.PEAK_REFRESH_RATE
gelesen. Dieser Wert wird während der Laufzeit geändert, um die aktuelle Geräteeinstellung widerzuspiegeln (z. B. in einer Menüoption). Der Standardwert wird im Konfigurations-Overlay fürR.integer.config_defaultPeakRefreshRate
festgelegt. - Einstellung für die minimale Aktualisierungsrate: Der Wert für die minimale Aktualisierungsrate wird aus
Settings.System.MIN_REFRESH_RATE
gelesen. Dieser Wert kann während der Laufzeit geändert werden, um die aktuelle Geräteeinstellung widerzuspiegeln (z. B. in einer Menüoption). Der Standardwert ist 0, es gibt also keinen Standardmindestwert. - Von Anwendung angeforderte ModeId: Apps können
WindowManager.LayoutParams.preferredDisplayModeId
so festlegen, dass sie eine bevorzugte Konfiguration widerspiegelt, mit der die Anzeige ausgeführt werden soll. In den meisten Fällen legtDisplayManager
die Standardkonfigurations-ID entsprechend fest und passt die Mindest- und Höchstaktualisierungsrate an die Aktualisierungsrate der Konfiguration an. - Energiesparmodus: Die Bildwiederholrate ist auf 60 Hz oder weniger beschränkt, wenn sich das Gerät im Energiesparmodus befindet. Dies wird durch
Settings.Global.LOW_POWER_MODE.
angezeigt.
- Standardeinstellung für die Bildwiederholrate: Der Standardwert für die Bildwiederholrate wird im Konfigurations-Overlay von
Nachdem DisplayManager
die Richtlinie festgelegt hat, legt SurfaceFlinger
die Bildwiederholrate basierend auf den aktiven Ebenen fest (Ebenen, die Frame-Updates in die Warteschlange stellen). Wenn der Eigentümer der Ebene eine Framerate festlegt, versucht SurfaceFlinger, die Aktualisierungsrate auf einen Multiplikator dieser Rate festzulegen.
Wenn beispielsweise zwei aktive Ebenen ihre Framerate auf 24 und 60 einstellen, wählt SurfaceFlinger 120 Hz aus, sofern verfügbar. Wenn diese Bildwiederholrate für SurfaceFlinger nicht verfügbar ist, wird versucht, die Bildwiederholrate auszuwählen, die den geringsten Fehler für die Framerate hat. Weitere Informationen finden Sie in der Entwicklerdokumentation unter developer.android.com.
SurfaceFlinger
verwaltet die folgenden Flags, um zu steuern, wie die Bildwiederholrate festgelegt wird:
ro.surface_flinger.use_content_detection_for_refresh_rate:
Wenn festgelegt, wird die Bildwiederholrate anhand der aktiven Ebenen festgelegt, auch wenn keine Framerate festgelegt wurde. SurfaceFlinger verwendet eine Heuristik, um die durchschnittlichen fps zu ermitteln, mit denen die Ebene Buffers postet. Dazu wird der dem Buffer zugeordnete Präsentationszeitstempel verwendet.ro.surface_flinger.set_touch_timer_ms
: Wenn der Wert größer als 0 ist, wird die Standardaktualisierungsrate verwendet, wenn ein Nutzer den Bildschirm während der konfigurierten Zeitüberschreitung berührt. Diese Heuristik ist für die Standardaktualisierungsrate für Animationen vorgesehen.ro.surface_flinger.set_idle_timer_ms
: Wenn der Wert größer als 0 ist, wird die minimale Bildwiederholrate verwendet, wenn es für den konfigurierten Zeitüberschreitungszeitraum keine Bildschirmaktualisierungen gibt.ro.surface_flinger.set_display_power_timer_ms
: Wenn der Wert größer als 0 ist, wird die Standardaktualisierungsrate für die konfigurierte Zeitüberschreitung verwendet, wenn das Display eingeschaltet wird (oder der Modus „Anzeige immer an“ deaktiviert wird).
Framerate-API
Mit der Framerate API können Apps die Android-Plattform über die gewünschte Framerate informieren. Sie ist in Apps für Android 11 verfügbar. Weitere Informationen zur Framerate API finden Sie in der Entwicklerdokumentation unter developer.android.com.
Entwickleroptionen
Dem Menü wurde eine neue Entwickleroption hinzugefügt, mit der ein Overlay mit der aktuellen Bildwiederholrate auf dem Display ein- und ausgeblendet werden kann. Sie finden die neue Option unter Einstellungen > System > Entwickleroptionen > Aktualisierungsrate anzeigen.