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 eine GraphicBufferProducer die Verbindung zu einem SurfaceFlinger GraphicBufferConsumer 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 am meisten Speicherplatz. Geräte, die auf Android 14 und höher aktualisiert werden, können diese Option ebenfalls nutzen, um den Arbeitsspeicher vollständig zu optimieren.
  • 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 LayerCommand.aidl-.

Abwärtskompatible Option aktivieren

Bei der abwärtskompatiblen Option zur Speicherplatzreduzierung wird ein echter Puffer im Cache-Slot durch einen 1×1-Platzhalterpuffer ersetzt. Dadurch wird Speicherplatz für alle geleerten Slots gespart, 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.

Wenn Sie die abwärtskompatible Option aktivieren, hat das folgende Auswirkungen:

  • Für AIDL-HALs: SurfaceFlinger sendet mehrere LayerCommand-Instanzen für eine einzelne Ebene, jeweils mit einem einzelnen BufferCommand. Jede 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 geprüft werden, ob die Cache-Slots von HAL-Implementierungen geleert werden. Sie können jedoch Ihre Debugging-Tools verwenden, um die Nutzung des Grafikpuffers zu überwachen. Beim Monitoring sollten Sie feststellen, dass in Szenarien, in denen mehrere verschiedene Videos auf YouTube schnell hintereinander angehalten und gestartet werden, weniger Out-of-Memory-Fehler auftreten.

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 ausreichendes Testen für die ordnungsgemäße Funktionalität angesehen werden, da einige Geräte diese VTS-Tests bestehen, aber bei realen Anwendungsfällen fehlschlagen.

Für neue VTS-Tests rufen Sie die folgenden Links auf: