Google setzt sich dafür ein, die Rassengerechtigkeit für schwarze Gemeinschaften zu fördern. Siehe wie.
Diese Seite wurde von der Cloud Translation API übersetzt.
Switch to English

BufferQueue und Gralloc

Die BufferQueue-Klasse verbindet Komponenten, die Puffer mit grafischen Daten ( Produzenten ) generieren, mit Komponenten, die die Daten zur Anzeige oder weiteren Verarbeitung akzeptieren ( Konsumenten ). Fast alles, was Puffer grafischer Daten durch das System bewegt, basiert auf BufferQueue.

Der Gralloc-Speicherzuweiser führt Pufferzuweisungen durch und wird über zwei herstellerspezifische HIDL-Schnittstellen implementiert (siehe hardware/interfaces/graphics/allocator/ und hardware/interfaces/graphics/mapper/ ). Die Funktion allocate() akzeptiert erwartete Argumente (Breite, Höhe, Pixelformat) sowie eine Reihe von Verwendungsflags.

Produzenten und Konsumenten von BufferQueue

Verbraucher erstellen und besitzen die BufferQueue-Datenstruktur und können in anderen Prozessen als ihre Hersteller existieren. Wenn ein Produzent einen Puffer benötigt, fordert er einen freien Puffer von BufferQueue an, indem er dequeueBuffer() aufruft und die Breite, Höhe, das Pixelformat und die Verwendungsflags der Puffer angibt. Der Produzent queueBuffer() dann den Puffer und gibt den Puffer durch Aufrufen von queueBuffer() an die Warteschlange zurück. Als nächstes acquireBuffer() der Verbraucher den Puffer mit acquireBuffer() und verwendet den acquireBuffer() . Wenn der Consumer fertig ist, gibt er den Puffer durch Aufrufen von releaseBuffer() an die Warteschlange zurück. Das Synchronisierungsframework steuert, wie sich Puffer durch die Android-Grafikpipeline bewegen.

Einige Merkmale der BufferQueue, wie beispielsweise die maximale Anzahl von Puffern, die sie enthalten kann, werden vom Hersteller und vom Verbraucher gemeinsam festgelegt. Die BufferQueue weist jedoch Puffer nach Bedarf zu. Puffer bleiben erhalten, sofern sich die Eigenschaften nicht ändern. Wenn ein Hersteller beispielsweise Puffer mit einer anderen Größe anfordert, werden alte Puffer freigegeben und neue Puffer bei Bedarf zugewiesen.

Pufferinhalte werden von BufferQueue niemals kopiert, da das Verschieben so vieler Daten ineffizient ist. Stattdessen werden Puffer immer von einem Handle übergeben.

Tracking BufferQueue mit Systrace

Verwenden Sie Systrace , ein Tool, das die Geräteaktivität über einen kurzen Zeitraum aufzeichnet , um zu verstehen, wie sich Grafikpuffer bewegen. Der Grafikcode auf Systemebene ist gut instrumentiert, ebenso wie ein Großteil des relevanten App-Framework-Codes.

Um Systrace zu verwenden, aktivieren Sie die Tags gfx , view und sched . BufferQueue-Objekte werden im Trace angezeigt. Wenn Sie beispielsweise während der Ausführung von Grafikas Wiedergabevideo (SurfaceView) eine Ablaufverfolgung durchführen, wird in der Zeile mit der Bezeichnung SurfaceView angegeben , wie viele Puffer zu einem bestimmten Zeitpunkt in der Warteschlange standen.

Der Wert erhöht sich, während die App aktiv ist, wodurch das Rendern von Frames durch den MediaCodec-Decoder ausgelöst wird. Der Wert verringert sich, während SurfaceFlinger arbeitet und Puffer verbraucht. Bei der Anzeige von Videos mit 30 fps variiert der Wert der Warteschlange zwischen 0 und 1, da die Anzeige mit ~ 60 fps mit der Quelle mithalten kann. SurfaceFlinger wird nur aktiviert, wenn noch etwas zu tun ist, nicht 60 Mal pro Sekunde. Das System versucht, Arbeit zu vermeiden, und deaktiviert VSYNC, wenn der Bildschirm nicht aktualisiert wird.

Wenn Sie zu Grafikas Wiedergabevideo (TextureView) wechseln und eine neue Ablaufverfolgung com.android.grafika eine Zeile mit der Bezeichnung com.android.grafika / com.android.grafika.PlayMovieActivity . Dies ist die Haupt-UI-Ebene, bei der es sich um eine weitere BufferQueue handelt. Da TextureView nicht in einer separaten Ebene, sondern in der UI-Ebene gerendert wird, werden hier alle videogesteuerten Aktualisierungen angezeigt.

Gralloc

Der Gralloc-Allokator HAL hardware/libhardware/include/hardware/gralloc.h führt Pufferzuweisungen über Verwendungsflags durch. Verwendungsflags enthalten Attribute wie:

  • Wie oft wird von Software (CPU) auf den Speicher zugegriffen?
  • Wie oft wird von der Hardware (GPU) auf den Speicher zugegriffen?
  • Gibt an, ob der Speicher als OpenGL ES (GLES) -Textur verwendet wird
  • Gibt an, ob der Speicher von einem Video-Encoder verwendet wird

Wenn beispielsweise das RGBA_8888 eines Produzenten RGBA_8888 Pixel angibt und der Produzent angibt, dass auf den Puffer über Software zugegriffen wird (dh eine App berührt Pixel auf der CPU), erstellt Gralloc einen Puffer mit 4 Bytes pro Pixel in RGBA-Reihenfolge. Wenn stattdessen ein Hersteller angibt, dass auf seinen Puffer nur über Hardware zugegriffen werden kann und Gralloc als GLES-Textur alles tun kann, was der GLES-Treiber wünscht, z. B. BGRA-Bestellung, nichtlineare Layouts und alternative Farbformate. Wenn Sie der Hardware erlauben, ihr bevorzugtes Format zu verwenden, kann dies die Leistung verbessern.

Einige Werte können auf bestimmten Plattformen nicht kombiniert werden. Beispielsweise erfordert das Video-Encoder-Flag möglicherweise YUV-Pixel, sodass das Hinzufügen von Softwarezugriff und das Angeben von RGBA_8888 fehlschlägt.

Das von Gralloc zurückgegebene Handle kann über Binder zwischen Prozessen übergeben werden.

Geschützte Puffer

Mit dem Gralloc-Verwendungsflag GRALLOC_USAGE_PROTECTED kann der Grafikpuffer nur über einen hardwaregeschützten Pfad angezeigt werden. Diese Overlay-Ebenen sind die einzige Möglichkeit, DRM-Inhalte anzuzeigen (auf DRM-geschützte Puffer kann von SurfaceFlinger oder dem OpenGL ES-Treiber nicht zugegriffen werden).

DRM-geschütztes Video kann nur auf einer Überlagerungsebene dargestellt werden. Videoplayer, die geschützte Inhalte unterstützen, müssen mit SurfaceView implementiert werden. Software, die auf ungeschützter Hardware ausgeführt wird, kann den Puffer nicht lesen oder schreiben. Hardware-geschützte Pfade müssen im Hardware Composer-Overlay angezeigt werden (dh geschützte Videos verschwinden von der Anzeige, wenn Hardware Composer auf OpenGL ES-Komposition umschaltet).

Einzelheiten zu geschützten Inhalten finden Sie unter DRM .