Mehrfach-Aktualisierungsrate

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 Methode setActiveConfig und bietet mehr Informationen zur Konfigurationsänderung. Die Einschränkungen sind Teil der vsyncPeriodChangeConstraints-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 auf true festgelegt ist, sollte die Implementierung SEAMLESS_NOT_POSSIBLE als Rückgabecode zurückgeben und den neuen onSeamlessPossible-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. Die newVsyncAppliedTimeNanos-Parameter müssen auf die Zeit in CLOCK_MONOTONIC festgelegt werden, zu der das neue Display mit dem neuen vsync-Zeitraum aktualisiert wird. Zusammen mit desiredTimeNanos 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, und refreshTimeNanos, 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ür SurfaceFlinger 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ür R.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 legt DisplayManager 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.

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.