Ebenen und Displays sind zwei Primitive, die die Zusammensetzung und Interaktionen mit der Displayhardware darstellen.
Ebenen
Ein Layer ist die wichtigste Zusammensetzungseinheit. Eine Ebene ist ein
eine Kombination aus einer surface und einer Instanz von
SurfaceControl
Jede Ebene hat eine Reihe von Eigenschaften, die definieren, wie sie mit anderen Ebenen interagiert. Die Ebeneneigenschaften werden in der folgenden Tabelle beschrieben.
Attribut | Beschreibung |
---|---|
Positional | Definiert, wo die Ebene auf ihrer Anzeige angezeigt wird. Enthält Informationen wie die Positionen der Kanten einer Ebene und ihre Z-Reihenfolge relativ zu anderen Ebenen (ob sie vor oder hinter anderen Ebenen liegen soll). |
Content | Hier wird festgelegt, wie die auf der Ebene angezeigten Inhalte innerhalb der durch die Positionierungseigenschaften definierten Grenzen dargestellt werden sollen. Enthält Informationen wie „Zuschneiden“ (um einen Teil des Inhalts so zu vergrößern, dass er die Grenzen der Ebene füllt) und „Transformieren“ (um gedrehte oder gespiegelte Inhalte anzuzeigen). |
Komposition | Hier wird festgelegt, wie die Ebene mit anderen Ebenen kombiniert werden soll. Enthält Informationen wie Mischmodus und ein schichtübergreifender Alphawert für Alphawert Zusammensetzung. |
Optimierung | Bietet Informationen, die nicht unbedingt für die korrekte Zusammensetzung der Ebene erforderlich sind, aber vom Hardware Composer (HWC) verwendet werden können, um die Zusammensetzung zu optimieren. Enthält Informationen wie den sichtbaren Bereich der Ebene und welcher Teil der Ebene seit dem vorherigen Frame aktualisiert wurde. |
Displays
Display ist eine weitere wichtige Zusammensetzung. Ein System kann haben mehrere Displays und Bildschirme können während des normalen Systembetriebs hinzugefügt oder entfernt werden. Bildschirme werden auf Anfrage des HWC oder des Frameworks hinzugefügt oder entfernt. Die angezeigten HWC-Geräte, für die eine Anfrage gesendet wird, werden hinzugefügt oder entfernt, wenn ein externes Display mit dem Gerät verbunden oder getrennt ist, was als Hotplugging. Kunden fordern virtuelle Displays an, deren Inhalte in einen Zwischenspeicher außerhalb des Bildschirms und nicht auf einen physischen Bildschirm übertragen.
Virtuelle Displays
SurfaceFlinger unterstützt ein internes Display (im Smartphone oder Tablet integriert), externe Displays (z. B. ein über HDMI angeschlossener Fernseher) und mindestens ein virtueller Bildschirm die zusammengesetzte Ausgaben innerhalb des Systems zur Verfügung stellen. Virtuelle Displays können verwendet werden, um den Bildschirm aufzunehmen oder über ein Netzwerk zu senden. Generierte Frames für eine virtuelle Anzeige in eine BufferQueue geschrieben werden.
Virtuelle Displays können dieselben Ebenen wie das Hauptdisplay (Ebenenstapel) verwenden oder eigene Ebenen haben. Für ein virtuelles Display gibt es keine VSYNC-Funktion. Daher löst die VSYNC-Funktion des internen Displays die Zusammensetzung für alle Displays aus.
Bei HWC-Implementierungen, die sie unterstützen, können virtuelle Displays mit OpenGL ES (GLES), HWC oder sowohl GLES als auch HWC zusammengesetzt werden. In nicht unterstützten Implementierungen werden virtuelle Displays immer mithilfe von GLES
Fallstudie: Bildschirmaufzeichnung
Mit dem Befehl screenrecord
kann der Nutzer
zeichnen Sie alles, was auf dem Bildschirm angezeigt wird, als .mp4
-Datei auf
Laufwerk. Dazu empfängt das System zusammengesetzte Frames von SurfaceFlinger, schreibt sie in den Videoencoder und dann die codierten Videodaten in eine Datei. Die Videocodecs werden von einem separaten Prozess (mediaserver
) verwaltet, sodass große Grafik-Buffer im System bewegt werden müssen. Das Ziel ist es, Videos mit 60 fps bei voller Auflösung aufzunehmen. Der Schlüssel für eine effiziente Ausführung ist BufferQueue.
Mit der Klasse MediaCodec
kann eine Anwendung Daten als Rohbyte in Zwischenspeichern bereitstellen.
oder durch eine Oberfläche hindurch. Wenn screenrecord
Zugriff auf einen Videoencoder anfordert, erstellt der mediaserver
-Prozess eine BufferQueue, stellt eine Verbindung zur Verbraucherseite her und gibt die Produzentenseite dann als Oberfläche an screenrecord
zurück.
Das Dienstprogramm screenrecord
fordert dann SurfaceFlinger auf,
ein virtuelles Display, das den Hauptbildschirm spiegelt, das heißt, es hat alle
Layers) und weist es an, die Ausgabe an die Oberfläche zu senden, die aus dem
mediaserver
-Prozess In diesem Fall ist SurfaceFlinger der Ersteller
und nicht auf den Verbraucher.
Nach Abschluss der Konfiguration wird screenrecord
ausgelöst, wenn
werden die codierten Daten angezeigt. Beim Zeichnen der Apps wandern die Puffer an SurfaceFlinger,
der sie in einem einzigen Zwischenspeicher zusammenfasst, der direkt an das Video gesendet wird.
wird im mediaserver
-Prozess ausgeführt. Die vollständigen Frames sind niemals
vom screenrecord
-Prozess gesehen. Intern hat der mediaserver
-Prozess eine eigene Methode zum Verschieben von Puffern, die auch Daten per Handle übergibt, wodurch der Overhead minimiert wird.
Fallstudie: Sekundäre Displays simulieren
Der WindowManager kann SurfaceFlinger auffordern, eine sichtbare Ebene zu erstellen, für welche SurfaceFlinger fungiert als BufferQueue-Nutzer. Es ist auch möglich, SurfaceFlinger zu bitten, ein virtuelles Display zu erstellen, für das SurfaceFlinger als BufferQueue-Produzent fungiert.
Wenn Sie eine virtuelle Anzeige mit einer sichtbaren Ebene verbinden, wird ein Closed Loop erstellt.
in dem der zusammengesetzte Bildschirm
in einem Fenster angezeigt wird. Dieses Fenster ist jetzt Teil des
zusammengesetzte Ausgabe erstellen, sodass bei der nächsten Aktualisierung das zusammengesetzte Bild im Fenster aktualisiert wird
zeigt auch den Fensterinhalt an. Um dies in Aktion zu sehen, aktivieren Sie
Entwickleroptionen in den Einstellungen, wählen Sie
Simuliere sekundäre Bildschirme und aktiviere ein Fenster. Um zu sehen,
Sekundäre Displays in Aktion, verwende screenrecord
, um die Handlung einzufangen
und dann Frame für Frame abspielen.