SurfaceFlinger und WindowManager

SurfaceFlinger akzeptiert Puffer, erstellt Puffer und sendet Puffer an die Anzeige. WindowManager stellt SurfaceFlinger Puffer und Fenstermetadaten bereit, die SurfaceFlinger verwendet, um Oberflächen zur Anzeige zusammenzusetzen.

SurfaceFlinger

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

Eine Möglichkeit, wie SurfaceFlinger Puffer akzeptiert, ist BufferQueue und SurfaceControl. Wenn eine App in den Vordergrund tritt, fordert sie Puffer von WindowManager an. WindowManager fordert dann eine Ebene von SurfaceFlinger an. Eine Ebene ist eine Kombination aus einer Oberfläche , die die BufferQueue enthält, und einem SurfaceControl , das die Ebenenmetadaten wie den Anzeigerahmen enthält. SurfaceFlinger erstellt die Ebene und sendet sie an WindowManager. WindowManager sendet dann die Oberfläche an die App, behält aber das SurfaceControl bei, um das Erscheinungsbild der App auf dem Bildschirm zu manipulieren.

Android 10 fügt ASurfaceControl hinzu, eine weitere Möglichkeit, wie SurfaceFlinger Puffer akzeptieren kann. ASurfaceControl kombiniert eine Oberfläche und ein SurfaceControl in einem Transaktionspaket, das an SurfaceFlinger gesendet wird. Ein ASurfaceControl ist einer Ebene zugeordnet, die Apps über ASurfaceTransactions aktualisieren. Apps erhalten dann Informationen über ASurfaceTransactions durch Rückrufe, die ASurfaceTransactionStats mit Informationen wie Latch-Zeit, Erfassungszeiten usw. übergeben.

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

Komponente Beschreibung
ASurfaceControl Umschließt SurfaceControl und ermöglicht einer App, SurfaceControls zu erstellen, die Ebenen auf der Anzeige entsprechen.

Kann als untergeordnetes Element von ANativeWindow oder als untergeordnetes Element eines anderen ASurfaceControl erstellt werden.
ASurfaceTransaction Umschließt die Transaktion, um dem Client die Bearbeitung der beschreibenden Eigenschaften eines Layers, z. B. der Geometrie, zu ermöglichen, und sendet die aktualisierten Puffer an SurfaceFlinger.
ASurfaceTransactionStats Sendet Informationen zu präsentierten Transaktionen, z. B. Latchzeit, Erfassungszeiten und vorheriger Freigabezaun, über einen vorregistrierten Rückruf an eine App.

Obwohl Apps jederzeit Puffer übermitteln können, wird SurfaceFlinger nur zwischen den Anzeigeaktualisierungen aktiviert, um Puffer zu akzeptieren, was je nach Gerät unterschiedlich sein kann. Dies minimiert die Speichernutzung und vermeidet sichtbare Risse auf dem Bildschirm, die beim Aktualisieren der Anzeige während der Aktualisierung auftreten können.

Wenn sich die Anzeige zwischen Aktualisierungen befindet, sendet die Anzeige das VSYNC- Signal an SurfaceFlinger. Das VSYNC-Signal zeigt an, dass die Anzeige ohne Tearing aktualisiert werden kann. Wenn SurfaceFlinger das VSYNC-Signal empfängt, durchsucht SurfaceFlinger seine Ebenenliste auf der Suche nach neuen Puffern. Wenn SurfaceFlinger einen neuen Puffer findet, ruft SurfaceFlinger den Puffer ab; Wenn nicht, verwendet SurfaceFlinger weiterhin den zuvor erfassten Puffer. SurfaceFlinger muss immer etwas anzeigen, daher hängt es an einem Puffer. Wenn auf einem Layer noch nie Puffer übermittelt wurden, wird der Layer ignoriert.

Nachdem SurfaceFlinger alle Puffer für sichtbare Ebenen gesammelt hat, fragt es den Hardware Composer (HWC), wie die Komposition durchgeführt werden soll. Wenn das HWC den Ebenenzusammensetzungstyp als Client-Zusammensetzung markiert, setzt SurfaceFlinger diese Ebenen zusammen. Anschließend übergibt SurfaceFlinger den Ausgabepuffer an den HWC .

Fenstermanager

WindowManager steuert Fensterobjekte , die Container für Ansichtsobjekte sind. Fensterobjekte werden immer von Oberflächenobjekten unterstützt. 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, sodass SurfaceFlinger diese Daten verwenden kann, um Oberflächen auf dem Display zusammenzusetzen.

Vorrotation

Viele Hardware-Overlays unterstützen keine Rotation (und selbst wenn dies der Fall wäre, kostet es Rechenleistung); Die Lösung besteht darin, den Puffer zu transformieren, bevor er SurfaceFlinger erreicht. Android unterstützt einen Abfragehinweis ( NATIVE_WINDOW_TRANSFORM_HINT ) in ANativeWindow , um die wahrscheinlichste Transformation darzustellen, die von SurfaceFlinger auf den Puffer angewendet wird. GL-Treiber können diesen Hinweis verwenden, um den Puffer vorab zu transformieren, bevor er SurfaceFlinger erreicht, sodass er bei Ankunft korrekt transformiert wird.

Wenn Sie beispielsweise einen Hinweis zum Drehen um 90 Grad erhalten, erstellen Sie eine Matrix und wenden Sie sie auf den Puffer an, um zu verhindern, dass sie am Ende der Seite ausläuft. Um Energie zu sparen, führen Sie diese Vordrehung durch. Einzelheiten finden Sie in der ANativeWindow Schnittstelle, die in system/core/include/system/window.h definiert ist.