Mehrere Bildwiederholfrequenzen

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 vorhandenen setActiveConfig Methode und bietet weitere Informationen zur Konfigurationsänderung. Die Einschränkungen werden als Teil der vsyncPeriodChangeConstraints -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 auf true gesetzt ist, wird von der Implementierung erwartet, dass sie SEAMLESS_NOT_POSSIBLE als Rückgabecode zurückgibt und den neuen onSeamlessPossible 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 in CLOCK_MONOTONIC eingestellt werden, zu der die neue Anzeige mit der Aktualisierung im neuen Vsync-Zeitraum beginnt. Dies ermöglicht es der Plattform zusammen mit desiredTimeNanos , 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, und refreshTimeNanos “, 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, die SurfaceFlinger 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 im R.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 der DisplayManager 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.

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.