Was jeder Entwickler über Oberflächen, SurfaceHolder, EGLSurface, SurfaceView, GLSurfaceView, SurfaceTexture, TextureView, SurfaceFlinger und Vulkan wissen sollte.
Auf dieser Seite werden die wichtigsten Elemente der Grafikarchitektur auf Android-Systemebene beschrieben und wie sie vom App-Framework und vom Multimediasystem verwendet werden. Der Fokus liegt darauf, wie Puffer mit grafischen Daten durch das System bewegt werden. Wenn Sie sich jemals gefragt haben, warum sich SurfaceView und TextureView so verhalten, wie sie es tun, oder wie Oberflächen und EGLSurface interagieren, sind Sie hier genau richtig.
Es wird davon ausgegangen, dass Sie mit Android-Geräten und der App-Entwicklung vertraut sind. Sie benötigen keine detaillierten Kenntnisse des App-Frameworks und es werden nur sehr wenige API-Aufrufe erwähnt. Das Material überschneidet sich jedoch nicht mit anderer öffentlicher Dokumentation. Ziel ist es, Details zu den wichtigen Ereignissen zu liefern, die beim Rendern eines Frames für die Ausgabe auftreten, damit Sie beim Entwerfen einer App fundierte Entscheidungen treffen können. Dazu wird in diesem Dokument von unten nach oben beschrieben, wie die UI-Klassen funktionieren und nicht, wie sie verwendet werden können.
Dieser Abschnitt enthält mehrere Seiten, die alles von Hintergrundinformationen über HAL-Details bis hin zu Anwendungsfällen abdecken. Zuerst werden Android-Grafikpuffer erläutert, dann der Zusammensetzungs- und Anzeigemechanismus beschrieben und schließlich die Mechanismen auf höherer Ebene, die dem Compositor Daten liefern. Wir empfehlen, die Seiten in der folgenden Reihenfolge zu lesen und nicht zu einem Thema zu springen, das interessant klingt.
Low-Level-Komponenten
- BufferQueue und Gralloc. BufferQueue verbindet etwas, das Puffer mit grafischen Daten generiert (den Producer), mit etwas, das die Daten zur Anzeige oder Weiterverarbeitung akzeptiert (den Consumer). Die Pufferzuweisung erfolgt über den gralloc-Speicherzuweiser, der über eine anbieterspezifische HAL-Schnittstelle implementiert wird.
- SurfaceFlinger, Hardware Composer und virtuelle Displays. SurfaceFlinger akzeptiert Puffer mit Daten aus mehreren Quellen, setzt sie zusammen und sendet sie an das Display. Das Hardware Composer HAL (HWC) bestimmt die effizienteste Methode zum Compositing von Puffern mit der verfügbaren Hardware. Virtuelle Displays stellen die zusammengesetzte Ausgabe im System zur Verfügung (Aufzeichnen des Bildschirms oder Senden des Bildschirms über ein Netzwerk).
- Surface, Canvas und SurfaceHolder: Eine Oberfläche erzeugt eine Pufferwarteschlange, die häufig von SurfaceFlinger genutzt wird. Beim Rendern auf einer Oberfläche landet das Ergebnis in einem Puffer, der an den Nutzer gesendet wird. Canvas-APIs bieten eine Softwareimplementierung (mit Unterstützung für Hardwarebeschleunigung) zum direkten Zeichnen auf einer Oberfläche (Alternative auf niedriger Ebene zu OpenGL ES). Alles, was mit einer Ansicht zu tun hat, beinhaltet einen SurfaceHolder, dessen APIs das Abrufen und Festlegen von Oberflächenparametern wie Größe und Format ermöglichen.
- EGLSurface und OpenGL ES OpenGL ES (GLES) definiert eine API für das Rendern von Grafiken, die mit EGL kombiniert werden kann. EGL ist eine Bibliothek, mit der Fenster über das Betriebssystem erstellt und aufgerufen werden können. Zum Zeichnen von strukturierten Polygonen werden GLES-Aufrufe verwendet, zum Rendern auf dem Bildschirm EGL-Aufrufe. Auf dieser Seite wird auch ANativeWindow behandelt, das C/C++-Äquivalent der Java-Klasse „Surface“, mit der eine EGL-Fensterfläche aus nativem Code erstellt wird.
- Vulkan Vulkan ist eine plattformübergreifende API mit geringem Aufwand für leistungsstarke 3D-Grafiken. Ähnlich wie OpenGL ES bietet Vulkan Tools zum Erstellen hochwertiger Echtzeitgrafiken in Apps. Zu den Vorteilen von Vulkan gehören eine Verringerung des CPU-Aufwands und die Unterstützung der SPIR-V-Binary Intermediate-Sprache.
Allgemeine Komponenten
- SurfaceView und GLSurfaceView SurfaceView kombiniert eine Surface und eine View. Die Ansichtskomponenten von SurfaceView werden von SurfaceFlinger (und nicht von der App) zusammengesetzt. So kann das Rendering über einen separaten Thread/Prozess erfolgen und von der App-UI isoliert werden. GLSurfaceView bietet Hilfsklassen zum Verwalten von EGL-Kontexten, der Kommunikation zwischen Threads und der Interaktion mit dem Aktivitätslebenszyklus. Die Verwendung von GLSurfaceView ist jedoch nicht erforderlich, um GLES zu verwenden.
- SurfaceTexture SurfaceTexture kombiniert eine Oberfläche und eine GLES-Textur, um eine BufferQueue zu erstellen, für die Ihre App der Consumer ist. Wenn ein Producer einen neuen Puffer in die Warteschlange stellt, wird Ihre App benachrichtigt. Diese gibt dann den zuvor gehaltenen Puffer frei, ruft den neuen Puffer aus der Warteschlange ab und führt EGL-Aufrufe aus, um den Puffer als externe Textur für GLES verfügbar zu machen. Mit Android 7.0 wurde die Unterstützung für die sichere Wiedergabe von Texturvideos eingeführt, die die GPU-Nachbearbeitung von geschützten Videoinhalten ermöglicht.
- TextureView TextureView kombiniert eine Ansicht mit einer SurfaceTexture. TextureView umschließt eine SurfaceTexture und ist für das Reagieren auf Rückrufe und das Abrufen neuer Puffer verantwortlich. Beim Zeichnen verwendet TextureView den Inhalt des zuletzt empfangenen Puffers als Datenquelle und rendert an der Stelle und auf die Weise, die durch den Ansichtsstatus angegeben wird. Die Ansichtszusammenstellung erfolgt immer mit GLES. Daher kann es sein, dass durch Aktualisierungen von Inhalten auch andere Ansichtselemente neu gezeichnet werden.