Grafikspeicherverbrauch reduzieren

Im Grafik-Stack befindet sich ein Puffer-Cache pro Ebene zwischen Composer HAL und SurfaceFlinger, um den Overhead zu reduzieren, der mit dem Senden von Dateideskriptoren über IPC verbunden ist. Vor Android 14 wurde dieser Puffer-Cache nicht geleert, wenn ein GraphicBufferProducer die Verbindung zum GraphicBufferConsumer von SurfaceFlinger trennt, z. B. wenn ein MediaCodec die Verbindung zu einem SurfaceView trennt. Ab Android 14 können Sie diesen Puffer-Cache erzwingen, um den Grafikspeicherverbrauch zu reduzieren.

Wählen Sie eine der beiden folgenden Optionen aus:

  • Für Geräte, die mit Android 14 und höher auf den Markt kommen, müssen Sie die neue Composer HAL-API-Version 3.2 implementieren. Diese Option ist standardmäßig aktiviert und spart den maximalen Speicherplatz. Geräte, die auf Android 14 und höher aktualisiert werden, können diese Option ebenfalls nutzen, um den vollen Arbeitsspeichervorteil zu erzielen.
  • Für Geräte, die auf Android 14 aktualisiert werden und für die Sie die Composer HAL 3.2 API nicht implementieren möchten, können Sie die abwärtskompatible Option aktivieren. Mit dieser Option wird fast so viel Speicherplatz gespart wie mit der vorherigen Option.

In den folgenden beiden Abschnitten wird beschrieben, wie Sie die einzelnen Optionen implementieren.

Composer HAL 3.2 API implementieren

Damit Sie alle Vorteile des Grafikpuffer-Arbeitsspeichers nutzen können, müssen Sie Folgendes tun:

  1. Aktualisieren Sie Ihre Composer-HAL-Implementierung auf Version 3.2.
  2. Verarbeiten Sie LayerCommand::bufferSlotsToClear, indem Sie die durch die Slotnummern in der Liste angegebenen Puffercache-Einträge löschen.

Die Composer HAL 3.2-APIs für den Grafikpufferspeicher, einschließlich LayerCommand::bufferSlotsToClear, befinden sich in der Datei LayerCommand.aidl.

Abwärtskompatible Option aktivieren

Bei der abwärtskompatiblen Option zur Speicherreduzierung wird ein echter Puffer im Cache-Slot durch einen 1×1-Platzhalterpuffer ersetzt. Das führt zu einer Speicherplatzersparnis für alle gelöschten Slots, mit Ausnahme des aktuell aktiven Puffer-Slots. Wenn Sie nur einen Teil der Vorteile der Speicheroptimierung nutzen möchten, aktivieren Sie die abwärtskompatible Option, indem Sie die System-Property surface_flinger.clear_slots_with_set_layer_buffer auf true setzen. Diese System-Property befindet sich in der Datei property_contexts.

Wenn Sie diese System-Property festlegen, muss Ihre Composer HAL-Implementierung mehrere setLayerBuffer-Befehle für dieselbe Ebene in einem einzelnen Present-Zyklus korrekt verarbeiten.

Das Aktivieren der abwärtskompatiblen Option hat folgende Auswirkungen:

  • Für AIDL-HALs: SurfaceFlinger sendet mehrere LayerCommand-Instanzen für eine einzelne Ebene, jeweils mit einem einzelnen BufferCommand. Jedes BufferCommand enthält ein 1×1-Platzhalter-Puffer-Handle und eine Slotnummer für den Cache-Pufferslot, der geleert werden muss.

  • Für HIDL-HALs: SurfaceFlinger sendet mehrere SELECT_DISPLAY-, SELECT_LAYER- und SET_BUFFER-Befehle. Diese Befehle enthalten ein 1×1-Platzhalter-Buffer-Handle und eine Slotnummer für den Cache-Buffer-Slot, der geleert werden muss.

Die abwärtskompatible Option kann dazu führen, dass der Composer-HAL auf einigen Geräten abstürzt. Möglicherweise können Sie dieses Problem beheben, indem Sie Ihr Composer-HAL ändern. Der Code, der dieses Verhalten steuert, befindet sich hier:

Arbeitsspeicherverbrauch des Grafikpuffer-Cache testen

Mit Tests kann nicht überprüft werden, ob HAL-Implementierungen die Cache-Slots leeren. Sie können jedoch Ihre Debugging-Tools verwenden, um die Nutzung des Grafikpuffers zu überwachen. Bei der Überwachung werden Sie möglicherweise weniger „Out of Memory“-Fehler in Szenarien feststellen, in denen mehrere verschiedene Videos auf YouTube schnell gestoppt und gestartet werden.

Es sind VTS-Tests verfügbar, mit denen geprüft wird, ob die HAL-Implementierung funktional in der Lage ist, die neuen API-Aufrufe (HAL-Version 3.2+) oder mehrere setLayerBuffer-Befehle für die abwärtskompatible Implementierung zu empfangen. Dies sollte jedoch nicht als ausreichender Test für die ordnungsgemäße Funktion angesehen werden, da einige Geräte diese VTS-Tests bestehen, aber bei realen Anwendungsfällen fehlschlagen.

Informationen zu neuen VTS-Tests finden Sie unter den folgenden Links: