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 MethodesetActiveConfig
und bietet mehr Informationen zur Konfigurationsänderung. Die Einschränkungen werden als Teil dervsyncPeriodChangeConstraints
-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
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
, die der Plattform mitteilt, wann sie mit dem die Änderung der Aktualisierungsrate. DienewVsyncAppliedTimeNanos
-Parameter müssen auf die Zeit inCLOCK_MONOTONIC
festgelegt werden, zu der das neue Display mit der neuen vsync-Periode aktualisiert wird. Dies, zusammen mit MitdesiredTimeNanos
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, undrefreshTimeNanos
, 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ürSurfaceFlinger
, 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ürR.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 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.
- Einstellung für die Standardaktualisierungsrate: Der Wert für die Standardaktualisierungsrate
wird im
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.