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 zusammenzufügen.
SurfaceFlinger
SurfaceFlinger kann Puffer auf zwei Arten annehmen: über BufferQueue und SurfaceControl
oder über ASurfaceControl
.
SurfaceFlinger akzeptiert Puffer unter anderem über BufferQueue und SurfaceControl
. Wenn eine App in den Vordergrund kommt, fordert sie Puffer von WindowManager
an. WindowManager
fordert dann einen Layer von SurfaceFlinger an. Eine Ebene ist eine Kombination aus einer Surface, die die BufferQueue enthält, und einer SurfaceControl
-Instanz, die 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 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 in einem Transaktionspaket, das SurfaceFlinger empfängt. ASurfaceControl
ist einer Ebene zugeordnet, die von Apps über ASurfaceTransaction
-Instanzen aktualisiert wird. Apps erhalten dann Informationen zu ASurfaceTransaction
-Instanzen über Callbacks, die ASurfaceTransactionStats
mit Informationen wie der Verriegelungszeit 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 es 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 die beschreibenden Attribute einer Ebene, z. B. die Geometrie, bearbeiten kann, und sendet die aktualisierten Puffer an SurfaceFlinger. |
ASurfaceTransactionStats |
Sendet Informationen zu präsentierten Transaktionen, z. B. Latch-Zeit, Erfassungszeiten und vorherige Release-Fence, über einen vorregistrierten Callback an eine App. |
Apps können Puffer zwar jederzeit senden, SurfaceFlinger wird jedoch nur zwischen den Bildschirmaktualisierungen aktiviert, um Puffer zu empfangen. Dies kann je nach Gerät unterschiedlich sein. Dadurch wird die Arbeitsspeichernutzung minimiert und sichtbares Tearing auf dem Bildschirm vermieden, das auftreten kann, wenn das Display während der Aktualisierung aktualisiert wird.
Zwischen den Aktualisierungen sendet das Display das VSync-Signal an SurfaceFlinger. Das VSync-Signal gibt an, dass das Display ohne Tearing 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, ruft SurfaceFlinger ihn ab. Andernfalls wird der zuvor abgerufene Puffer weiterhin verwendet. SurfaceFlinger muss immer etwas anzeigen, daher wird ein Puffer beibehalten. Wenn für eine Ebene noch nie Puffer eingereicht wurden, ignoriert SurfaceFlinger die Ebene.
Nachdem SurfaceFlinger alle Puffer für sichtbare Ebenen erfasst hat, fragt es den Hardware Composer (HWC), wie die Komposition erfolgen soll. Wenn der HWC-Markierungstyp der Ebene als Client-Komposition festgelegt ist, führt SurfaceFlinger die Komposition dieser Ebenen aus. 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. Mit WindowManager
werden alle Fenstermetadaten an SurfaceFlinger gesendet, damit SurfaceFlinger diese Daten verwenden kann, um Oberflächen auf dem Display zusammenzusetzen.
Vor der Rotation
Viele Hardware-Overlays unterstützen keine Drehung (und selbst wenn, kostet das 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 anwenden wird.
GL-Treiber können diesen Hinweis verwenden, um den Puffer vorzutransformieren, bevor er SurfaceFlinger erreicht. Wenn der Puffer ankommt, ist er also bereits richtig transformiert.
Wenn Sie beispielsweise einen Hinweis zum Drehen um 90 Grad erhalten, generieren Sie eine Matrix und wenden Sie sie auf den Puffer an, damit er nicht vom Ende der Seite abläuft. Um Strom zu sparen, sollten Sie dies vor der Rotation tun. Weitere Informationen finden Sie in der ANativeWindow
-Schnittstelle, die in system/core/include/system/window.h
definiert ist.