SurfaceFlinger akzeptiert, setzt zusammen und sendet Puffer an das Display. WindowManager stellt SurfaceFlinger Puffer und Fenstermetadaten zur Verfügung, die SurfaceFlinger dann verwendet, um Oberflächen auf dem Display zusammenzusetzen.
SurfaceFlinger
SurfaceFlinger kann Puffer auf zwei Arten akzeptieren: über BufferQueue und
SurfaceControl, oder über ASurfaceControl.
Eine Möglichkeit, wie SurfaceFlinger Puffer akzeptiert, ist über 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
einer SurfaceControl-Instanz,
die die Ebenenmetadaten wie den Displayrahmen enthält.
SurfaceFlinger erstellt die Ebene und sendet sie an WindowManager. WindowManager
sendet die Oberfläche dann an die App, behält aber die SurfaceControl-Instanz bei, um das Erscheinungsbild der App auf dem Bildschirm zu bearbeiten.
Ab Android 10 bietet ASurfaceControl eine weitere Möglichkeit für SurfaceFlinger, Puffer zu akzeptieren. ASurfaceControl kombiniert eine Oberfläche
und eine SurfaceControl Instanz zu einem Transaktionspaket, das SurfaceFlinger erhält. ASurfaceControl ist mit einer Ebene verknüpft, die von Apps über ASurfaceTransaction-Instanzen aktualisiert wird. Apps erhalten dann Informationen zu
ASurfaceTransaction Instanzen über Callbacks, die ASurfaceTransactionStats
mit Informationen wie der Latch-Zeit und den Erfassungszeiten übergeben.
In der folgenden Tabelle werden ASurfaceControl und die zugehörigen Komponenten beschrieben:
| Komponente | Beschreibung |
|---|---|
ASurfaceControl |
Umschließt SurfaceControl und ermöglicht einer App, SurfaceControl-Instanzen zu erstellen, die
Ebenen auf dem Display entsprechen.Kann als untergeordnetes Element von ANativeWindow oder als untergeordnetes Element einer anderen ASurfaceControl-Instanz erstellt werden. |
ASurfaceTransaction |
Umschließt Transaction, damit der Client beschreibende
Eigenschaften einer Ebene wie die Geometrie bearbeiten und die aktualisierten Puffer an
SurfaceFlinger senden kann. |
ASurfaceTransactionStats |
Sendet Informationen zu präsentierten Transaktionen wie Latch-Zeit, Erfassungszeiten und vorherige Release-Fence über einen vorregistrierten Callback an eine App. |
Obwohl Apps jederzeit Puffer senden können, wird SurfaceFlinger nur zwischen den Displayaktualisierungen aktiviert, um Puffer zu akzeptieren. Dies kann je nach Gerät variieren. Dadurch wird die Arbeitsspeichernutzung minimiert und sichtbare Bildfehler auf dem Bildschirm vermieden, die auftreten können, wenn das Display während der Aktualisierung aktualisiert wird.
Wenn das Display zwischen den Aktualisierungen liegt, sendet es das VSync-Signal an SurfaceFlinger. Das VSync-Signal gibt an, dass das Display ohne Bildfehler aktualisiert werden kann. Wenn SurfaceFlinger das VSync-Signal empfängt, durchläuft es die Liste der Ebenen und sucht nach neuen Puffern. Wenn ein neuer Puffer gefunden wird, erfasst SurfaceFlinger ihn. Andernfalls wird der zuvor erfasste Puffer weiter verwendet. SurfaceFlinger muss immer etwas anzeigen, daher wird ein Puffer beibehalten. Wenn für eine Ebene noch nie Puffer gesendet wurden, ignoriert SurfaceFlinger die Ebene.
Nachdem SurfaceFlinger alle Puffer für sichtbare Ebenen erfasst hat, fragt es den Hardware Composer (HWC), wie die Komposition ausgeführt werden soll. Wenn der HWC den Kompositionstyp der Ebene als Client-Komposition kennzeichnet, setzt SurfaceFlinger diese Ebenen zusammen. Anschließend übergibt SurfaceFlinger den Ausgabepuffer an den HWC.
WindowManager
WindowManager steuert Window-Objekte,
die Container für View
-Objekte sind. Window-Objekte werden immer von
Surface-Objekten 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 dem Display zusammenzusetzen.
Vorrotation
Viele Hardware-Overlays unterstützen keine Rotation. Selbst wenn sie dies tun, 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 SurfaceFlinger auf den Puffer anwendet.
GL-Treiber können diesen Hinweis verwenden, um den Puffer vorab zu transformieren, bevor er SurfaceFlinger erreicht, damit er bei der Ankunft korrekt transformiert ist.
Wenn Sie beispielsweise einen Hinweis zum Drehen um 90 Grad erhalten, generieren und wenden Sie eine Matrix auf den Puffer an, um zu verhindern, dass er vom Ende der Seite abläuft. Führen Sie diese Vorrotation aus, um Energie zu sparen. Weitere Informationen finden Sie in der ANativeWindow-Schnittstelle, die in system/core/include/system/window.h definiert ist.