Ebenen und Displays

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.