SurfaceFlinger akzeptiert Puffer, setzt sie zusammen und sendet sie an das Display. WindowManager
stellt SurfaceFlinger Puffer und Fenstermetadaten zur Verfügung, die SurfaceFlinger verwendet, um Oberflächen für die Anzeige zusammenzusetzen.
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.
In Android 10 wurde ASurfaceControl
eingeführt, eine weitere Möglichkeit für SurfaceFlinger, Puffer zu akzeptieren. ASurfaceControl
kombiniert eine Oberfläche und eine SurfaceControl
-Instanz in einem Transaktionspaket, das an SurfaceFlinger gesendet wird. ASurfaceControl
ist einer Ebene zugeordnet, die von Apps über ASurfaceTransaction
-Instanzen aktualisiert wird. Apps erhalten dann Informationen zu ASurfaceTransaction
-Instanzen über Callbacks, die ASurfaceTransactionStats
übergeben, die Informationen wie die Latch-Zeit, die Erfassungszeiten usw. enthalten.
In der folgenden Tabelle finden Sie weitere Informationen zu ASurfaceControl
und den zugehörigen Komponenten:
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 Eigenschaften 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. Die Häufigkeit der Bildschirmaktualisierungen kann je nach Gerät variieren. 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 SurfaceFlinger die Liste der Ebenen und sucht nach neuen Puffern. Wenn SurfaceFlinger einen neuen Puffer findet, wird er abgerufen. Andernfalls wird der zuvor abgerufene Puffer weiter verwendet. SurfaceFlinger muss immer etwas anzeigen, daher wird ein Puffer beibehalten. Wenn für einen Layer noch nie Puffer eingereicht wurden, wird der Layer ignoriert.
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 von SurfaceFlinger auf den Puffer angewendet wird. GL-Treiber können diesen Hinweis verwenden, um den Puffer vor der Übergabe an SurfaceFlinger vorab zu transformieren. Wenn der Puffer ankommt, ist er also bereits korrekt 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.