SurfaceFlinger und WindowManager

SurfaceFlinger akzeptiert Zwischenspeicher, erstellt Zwischenspeicher und sendet Zwischenspeicher an den Display. WindowManager stellt SurfaceFlinger Buffers und Fenstermetadaten zur Verfügung, mit denen SurfaceFlinger Oberflächen auf dem Display zusammensetzt.

SurfaceFlinger

SurfaceFlinger kann Buffers auf zwei Arten akzeptieren: über BufferQueue und SurfaceControl oder über ASurfaceControl.

Eine Möglichkeit, wie SurfaceFlinger Buffers akzeptiert, ist über BufferQueue und SurfaceControl. Wenn eine App im Vordergrund angezeigt wird, fordert sie Puffer von WindowManager. WindowManager fordert dann eine Ebene von SurfaceFlinger an. Eine Ebene ist eine Kombination aus einer Surface, die die BufferQueue enthält, und einer SurfaceControl, die die Ebenenmetadaten wie den Displayframe enthält. SurfaceFlinger erstellt die Ebene und sendet sie an WindowManager. Fenstermanager sendet die Oberfläche an die App, behält das SurfaceControl jedoch die Darstellung der App auf dem Bildschirm beeinflussen.

In Android 10 wird ASurfaceControl hinzugefügt, eine weitere Möglichkeit, wie SurfaceFlinger Buffers akzeptieren kann. ASurfaceControl kombiniert eine Oberfläche und SurfaceControl in ein Transaktionspaket verpacken, SurfaceFlinger. Ein ASurfaceControl-Element ist mit einer Ebene verknüpft, die Apps über ASurfaceTransactions aktualisieren. Apps erhalten dann Informationen zu ASurfaceTransactions über Callbacks, die ASurfaceTransactionStats mit Informationen wie Latch-Zeit und Akquisitionszeiten übergeben.

Die folgende Tabelle enthält weitere Details zu ASurfaceControl und seinen zugehörigen Komponenten.

Komponente Beschreibung
ASurfaceControl Bindet SurfaceControl ein und ermöglicht einer App, SurfaceControls zu erstellen, die entsprechen den Ebenen auf dem Bildschirm.

Kann erstellt werden als untergeordnetes Element von ANativeWindow oder als untergeordnetes Element eines anderen ASurfaceControl-Elements festgelegt.
ASurfaceTransaction Umschließt die Transaktion, damit der Client die beschreibenden Eigenschaften einer Ebene bearbeiten kann, z. B. die Geometrie, und sendet die aktualisierten Buffers an SurfaceFlinger.
ASurfaceTransactionStats Sendet Informationen zu Transaktionen, die präsentiert wurden, z. B. der letzten Release-Zeit oder -Synchronisation mithilfe einer vorregistrierter Callback.

Obwohl Apps jederzeit Puffer senden können, wird SurfaceFlinger nur bis zu zwischen Anzeigeaktualisierungen Zwischenspeichern, die je nach . Dies minimiert die Arbeitsspeichernutzung und vermeidet sichtbares Aufreißen auf der angezeigt, der auftreten kann, wenn das Display während der Aktualisierung aktualisiert wird.

Wenn sich die Anzeige zwischen zwei Aktualisierungen befindet, sendet das Display die VSYNC an SurfaceFlinger. Das VSYNC-Signal gibt an, dass die Anzeige ohne zu zerreißen. Wenn SurfaceFlinger das VSYNC-Signal empfängt, zeigt SurfaceFlinger durch die Liste der Layers Suche nach neuen Puffern. Wenn SurfaceFlinger einen neuen Puffer findet, holt es ihn ab. Andernfalls verwendet SurfaceFlinger weiterhin den zuvor abgerufenen Puffer. SurfaceFlinger muss immer etwas anzeigen, und bleibt an einem Puffer. Wenn für eine Ebene noch keine Buffers gesendet wurden, wird die Ebene ignoriert.

Nachdem SurfaceFlinger alle Buffers für sichtbare Ebenen erfasst hat, fragt er den Hardware Composer (HWC), wie die Komposition erfolgen soll. Wenn der HWC den Ebenenzusammensetzungstyp als Clientzusammensetzung kennzeichnet, werden diese Ebenen von SurfaceFlinger zusammengesetzt. Anschließend gibt SurfaceFlinger den Ausgabepuffer an die HWC weiter.

WindowManager

WindowManager steuert window-Objekte, also Container für view-Objekte. Fensterobjekte werden immer von Oberflächenobjekten. Der WindowManager überwacht Lebenszyklen, Eingabe- und Fokusereignisse, Bildschirmausrichtung, Übergänge, Animationen, Position, Transformationen, Z-Reihenfolge und viele andere Aspekte eines Fensters. WindowManager sendet alle Fenstermetadaten an SurfaceFlinger, damit SurfaceFlinger diese Daten zum Zusammensetzen von Oberflächen auf dem Display verwenden kann.

Vor der Rotation

Viele Hardware-Overlays unterstützen keine Drehung (und selbst wenn sie dies tun, kosten sie Prozessorleistung); besteht die Lösung darin, den Puffer zu transformieren, bevor er SurfaceFlinger. Android unterstützt einen Abfragehinweis (NATIVE_WINDOW_TRANSFORM_HINT) in ANativeWindow nach stellen die wahrscheinlichste Transformation dar, die auf den Zwischenspeicher angewendet wird. SurfaceFlinger. GL-Treiber können diesen Hinweis verwenden, um den Zwischenspeicher vorzu transformieren. bevor er SurfaceFlinger erreicht. Wenn der Zwischenspeicher eintrifft, ist der transformiert haben.

Wenn Sie beispielsweise einen Hinweis auf eine Drehung um 90 Grad erhalten, generieren Sie ein um zu verhindern, dass sie am Ende der Seite ausgeführt wird. Speichern machen Sie diese Vorrotation. Weitere Informationen finden Sie in den ANativeWindow. Schnittstelle definiert in system/core/include/system/window.h.