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.

SurfaceFlinger

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

Eine Möglichkeit, wie SurfaceFlinger Puffer akzeptiert, ist über BufferQueue und SurfaceControl. Wenn eine App in den Vordergrund kommt, fordert sie Puffer von WindowManager an. WindowManager fordert dann eine Ebene von SurfaceFlinger an. Ein Layer ist eine Kombination aus einer Surface , die die BufferQueue enthält, und einem SurfaceControl , das die Layer-Metadaten 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 die Darstellung der App auf dem Bildschirm zu manipulieren.

Android 10 fügt ASurffaceControl hinzu, was eine weitere Möglichkeit ist, wie SurfaceFlinger Puffer akzeptieren kann. ASurffaceControl kombiniert eine Oberfläche und ein SurfaceControl zu einem Transaktionspaket, das an SurfaceFlinger gesendet wird. Ein ASurffaceControl ist einem Layer zugeordnet, den Apps über ASurfaceTransactions aktualisieren. Apps erhalten dann Informationen über ASurffaceTransactions durch Rückrufe, die ASurffaceTransactionStats mit Informationen wie Latch-Zeit, Erfassungszeiten usw. weitergeben.

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

Komponente Beschreibung
AOberflächenkontrolle 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.
AOberflächentransaktion Umschließt die Transaktion, damit der Client die beschreibenden Eigenschaften einer Ebene bearbeiten kann, z. B. die Geometrie, und sendet die aktualisierten Puffer an SurfaceFlinger.
AOberflächentransaktionsstatistik Sendet über einen vorregistrierten Rückruf Informationen zu präsentierten Transaktionen, z. B. Verriegelungszeit, Erfassungszeiten und frühere Freigabegrenzen, an eine App.

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 die Speichernutzung und vermeidet sichtbares Tearing auf dem Bildschirm, das beim Aktualisieren der Anzeige während der Aktualisierung auftreten kann.

Wenn sich die Anzeige zwischen Aktualisierungen befindet, sendet die Anzeige das VSYNC -Signal an SurfaceFlinger. Das VSYNC-Signal zeigt an, dass die Anzeige ohne Reißen aufgefrischt werden kann. Wenn SurfaceFlinger das VSYNC-Signal empfängt, geht SurfaceFlinger durch seine Liste von Ebenen und sucht 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, also hängt es an einem Puffer. Wenn für einen Layer noch nie Puffer übermittelt wurden, wird der Layer ignoriert.

Nachdem SurfaceFlinger alle Puffer für sichtbare Schichten gesammelt hat, fragt es den Hardware Composer (HWC), wie die Zusammensetzung durchgeführt werden soll. Wenn der HWC den Layer-Kompositionstyp als Client-Komposition markiert, setzt SurfaceFlinger diese Layer zusammen. Dann ü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 sie dies tun, kostet es Rechenleistung); Die Lösung besteht darin, den Puffer umzuwandeln, 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 korrekt transformiert wird, wenn der Puffer ankommt.

Wenn Sie beispielsweise einen Hinweis zum Drehen um 90 Grad erhalten, generieren Sie eine Matrix und wenden Sie sie auf den Puffer an, um zu verhindern, dass sie über das Ende der Seite hinausläuft. Führen Sie diese Vordrehung durch, um Strom zu sparen. Einzelheiten finden Sie in der ANativeWindow Schnittstelle, die in system/core/include/system/window.h .