Mehrere Aktualisierungsraten

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 Methode setActiveConfig und enthält weitere Informationen zur Konfigurationsänderung. Die Einschränkungen werden als Teil der vsyncPeriodChangeConstraints-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 auf true festgelegt ist, wird erwartet, dass die Implementierung SEAMLESS_NOT_POSSIBLE als Rückgabecode zurückgibt und den neuen onSeamlessPossible-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. Die newVsyncAppliedTimeNanos-Parameter müssen auf die Zeit in CLOCK_MONOTONIC festgelegt werden, zu der das neue Display mit dem neuen V‑Sync-Zeitraum aktualisiert wird. Zusammen mit desiredTimeNanos 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, und refreshTimeNanos, 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ür SurfaceFlinger 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-Overlay R.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 mit DisplayManager 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.

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.