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 mit der Anzeige zusammenzusetzen.

OberflächeFlinger

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 kommt, fordert er Puffer von Windowmanager . WindowManager fordert dann einen Layer von SurfaceFlinger an. Eine Schicht ist eine Kombination aus einer Oberfläche , die die BufferQueue enthält, und einen SurfaceControl , die die Schicht - Metadaten wie der Anzeigerahmen enthält. SurfaceFlinger erstellt den Layer und sendet ihn an WindowManager. WindowManager sendet dann die Oberfläche an die App, behält jedoch das SurfaceControl bei, um die Darstellung der App auf dem Bildschirm zu manipulieren.

Android 10 fügt ASurfaceControl hinzu, eine weitere Möglichkeit, mit der SurfaceFlinger Puffer akzeptieren kann. ASurfaceControl kombiniert eine Oberfläche und ein SurfaceControl zu einem Transaktionspaket, das an SurfaceFlinger gesendet wird. Ein ASurfaceControl ist einem Layer zugeordnet, den Apps über ASurfaceTransactions aktualisieren. Apps erhalten dann Informationen zu 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
AOberflächensteuerung Umschließt SurfaceControl und ermöglicht es 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.
AOberflächentransaktion Umschließt Transaction, damit der Client die beschreibenden Eigenschaften eines Layers bearbeiten kann, z. B. Geometrie, und sendet die aktualisierten Puffer an SurfaceFlinger.
AsurfaceTransactionStats Sendet Informationen zu angezeigten Transaktionen, z.

Obwohl Apps jederzeit Puffer senden können, wacht SurfaceFlinger nur auf, um Puffer zwischen Anzeigeaktualisierungen zu akzeptieren, die je nach Gerät unterschiedlich sein können. Dies minimiert den Speicherverbrauch und vermeidet sichtbares Tearing auf dem Bildschirm, das beim Aktualisieren der Anzeige während der Aktualisierung auftreten kann.

Wenn die Anzeige zwischen Auffrischungen ist, sendet die Anzeige das VSYNC Signal zu Surface. Das VSYNC-Signal zeigt an, dass die Anzeige ohne Tearing aktualisiert werden kann. Wenn SurfaceFlinger das VSYNC-Signal empfängt, geht SurfaceFlinger durch die Liste der Layer und sucht nach neuen Puffern. Wenn SurfaceFlinger einen neuen Puffer findet, erwirbt SurfaceFlinger den Puffer; Wenn nicht, verwendet SurfaceFlinger weiterhin den zuvor erfassten Puffer. SurfaceFlinger muss immer etwas anzeigen, also hängt es an einem Puffer. Wenn noch nie Puffer für einen Layer übermittelt wurden, wird der Layer ignoriert.

Nachdem SurfaceFlinger alle Puffer für sichtbare Layer gesammelt hat, fragt es den Hardware Composer (HWC), wie die Komposition ausgeführt werden soll. Wenn der HWC den Layer-Kompositionstyp als Client-Komposition markiert, stellt SurfaceFlinger diese Layer zusammen. Dann durchläuft die Surfaceausgangspuffer zum HWC .

Fenstermanager

Window steuert Fensterobjekte, die für Behälter sind Ansicht Objekten. 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, damit SurfaceFlinger diese Daten verwenden kann, um Oberflächen auf der Anzeige zusammenzusetzen.

Vorrotation

Viele Hardware-Overlays unterstützen keine Rotation (und selbst wenn, kostet es Rechenleistung); Die Lösung besteht darin, den Puffer zu transformieren, bevor er SurfaceFlinger erreicht. Android unterstützt ein Abfrage - Hinweis ( NATIVE_WINDOW_TRANSFORM_HINT ) in ANativeWindow repräsentiert die am wahrscheinlichsten von dem Puffer Surface angewandt werden transformiert. GL-Treiber können diesen Hinweis verwenden, um den Puffer vorab zu transformieren, bevor er SurfaceFlinger erreicht, damit der Puffer richtig transformiert wird, wenn er ankommt.

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 er über das Ende der Seite hinausläuft. Um Strom zu sparen, führen Sie diese Vordrehung durch. Weitere Einzelheiten finden Sie in der ANativeWindow Schnittstelle in definierten system/core/include/system/window.h .