Mehrfach-Aktualisierungsrate

Android 11 unterstützt jetzt Geräte mit mehreren Aktualisierungsraten. Es gibt drei Hauptkomponenten dieser Funktion:

  • Neue HAL APIs eingeführt in android.hardware.graphics.composer@2.4
  • 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

Das neue Attribut „CONFIG_GROUP“ wurde hinzugefügt zu IComposerClient::Attribute, die mit der Methode getDisplayAttribute_2_4 API verwenden. Mit diesem Attribut können Anbieter Displaykonfigurationen gruppieren. Konfigurationen in derselben Gruppe erlauben, in den meisten Fällen nahtlos zwischen ihnen wechseln. Die Konfigurationsgruppe wird verwendet Plattform erstellt, um zu unterscheiden, welche Konfigurationen um die Aktualisierungsrate zu ändern. config.

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@48Hz

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. Dieses Problem lässt sich mithilfe von Konfigurationsgruppen lösen. Dazu werden 60 Hz und 90 Hz in einer Konfigurationsgruppe und 48 Hz und 72 Hz in einer anderen Konfigurationsgruppe gruppiert. Die Plattform weiß, dass sie zwischen 60 Hz und 90 Hz und 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 Bildwiederholrate 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 Aktualisierungsrate in Bezug auf vsync-Zeitraum), in dem die Anzeige ausgeführt wird. Dies ist besonders nützlich, wenn muss der Wechsel zwischen der Aktualisierungsrate und der aktuellen Aktualisierungsrate um zu entscheiden, wann der nächste Frame gestartet wird.
setActiveConfigWithConstraints
Die Methode setActiveConfigWithConstraints ist eine neue Erweiterung der vorhandenen Methode setActiveConfig und bietet mehr Informationen zur Konfigurationsänderung. Die Einschränkungen werden als Teil der vsyncPeriodChangeConstraints-Parameter und enthalten Folgendes: Parameter.
    gewünschte-Zeit-Nanos
    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). Dies ist nützlich, wenn die Plattform eine Aktualisierungsrate im Voraus planen möchte. aber bereits einige Puffer in der Warteschlange vorhanden sind, die angezeigt werden sollen. Die Plattform legt diese Zeit entsprechend fest, um diese Puffer zu berücksichtigen und dafür zu sorgen, dass die Umstellung der Bildwiederholrate so reibungslos wie möglich erfolgt.
    seamlessRequired
    Falls „true“, muss die Änderung des vSync-Zeitraums nahtlos erfolgen ohne erkennbares visuelles Artefakt. 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 beginnt). 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, die der Plattform mitteilt, wann sie mit dem die Änderung der Aktualisierungsrate. Die newVsyncAppliedTimeNanos-Parameter müssen auf die Zeit in CLOCK_MONOTONIC festgelegt werden, zu der das neue Display mit der neuen vsync-Periode aktualisiert wird. Dies, zusammen mit Mit desiredTimeNanos kann die Plattform die Aktualisierung im Voraus planen um die Aktualisierungsrate zu ändern. Dieses ermöglicht einen nahtlosen Übergang der Aktualisierungsrate.

Bei einigen Implementierungen muss vor der Aktualisierung ein Aktualisierungsframe gesendet werden gesendet werden kann. Dafür hat der HAL die refreshRequired Parameter, der angibt, dass ein Aktualisierungsframe erforderlich ist, und refreshTimeNanos, um die erste vsync anzuzeigen, bei der ein Aktualisierungsframe danach gesendet werden muss.

onVsyncPeriodTimingChanged [callback]
Ein neuer Callback, der vom HAL aufgerufen werden kann, um der Plattform zu signalisieren, dass einige der Zeitachse geändert und die Plattform muss ihre Zeitachse anpassen. Dieser Callback sollte aufgerufen werden, wenn die alte Zeitachse aus irgendeinem Grund aufgrund einer langen Verarbeitungszeit im HAL oder einer späten Aktualisierung verpasst Frame.

Wie entscheidet die Plattform, die Aktualisierungsrate zu ändern?

Die Auswahl der Bildwiederholrate erfolgt in den folgenden beiden Systemdiensten:

Anzeigemanager
Die DisplayManager legt die übergeordnete Richtlinie fest. um die Aktualisierungsrate herum. Es wird eine Standardanzeigekonfiguration festgelegt, die mit der HAL-Konfiguration von Composer identisch ist. Außerdem wird ein Mindest- und ein Höchstwert Werte für SurfaceFlinger, die zum Aktualisieren ausgewählt werden sollen zu zahlen.
SurfaceFlinger
Bestimmt die Bildwiederholrate, indem eine Konfiguration festgelegt wird, die sich in derselben Konfigurationsgruppe wie die Standardkonfiguration befindet und eine Bildwiederholrate innerhalb des Min/Max-Bereichs 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.
  • Die Beschränkung des Bereichs der Minimal- und Maximalwerte durch Iteration über die Systembedingungen
    • Einstellung für die Standardaktualisierungsrate: Der Wert für die Standardaktualisierungsrate wird im R.integer.config_defaultRefreshRate-Konfigurations-Overlay 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 höchste Aktualisierungsrate wird aus Settings.System.PEAK_REFRESH_RATE gelesen. Dieser Wert wird zur Laufzeit geändert, um die aktuelle Geräteeinstellung widerzuspiegeln (z. B. aus einer Menüoption). Der Standardwert wird in der Konfigurations-Overlay für R.integer.config_defaultPeakRefreshRate.
    • Einstellung für die Mindestaktualisierungsrate: Der Wert für die Mindestaktualisierungsrate wird von Settings.System.MIN_REFRESH_RATE gelesen. Dieser Wert kann während der Laufzeit geändert werden, um die aktuelle Geräteeinstellung widerzuspiegeln (z. B. über eine Menüoption). Der Standardwert ist 0, es gibt also keinen Standardmindestwert.
    • Von der Anwendung angeforderte ModeId: Apps können WindowManager.LayoutParams.preferredDisplayModeId so festlegen, dass das Display mit einer bevorzugten Konfiguration betrieben 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 SurfaceFlinger setzen, wählt 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 wird die Aktualisierungsrate anhand des aktiven Layern, 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 > 0, die Standardeinstellung Die Aktualisierungsrate wird verwendet, wenn ein Nutzer den Bildschirm für die konfigurierte Timeout festlegen. 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 > 0, die Die Standardaktualisierungsrate wird beim Einschalten des Displays (oder außerhalb des AOD) für das konfigurierte Zeitlimit.

Framerate-API

Mit der Framerate API können Apps die Android-Plattform über die beabsichtigte Framerate informieren. Sie ist für Apps verfügbar, die auf Android 11 ausgerichtet sind. Weitere Informationen über der Framerate API findest du in der Entwicklerdokumentation unter developer.android.com.

Entwickleroptionen

Dem Menü wurde eine neue Entwickleroption hinzugefügt, mit der ein Overlay Anzeige mit der aktuellen Aktualisierungsrate. Sie finden die neue Option unter Einstellungen > System > Entwickleroptionen > Aktualisierungsrate anzeigen.