Grafikspeicherverbrauch reduzieren

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

Wählen Sie eine der beiden folgenden Optionen aus:

  • Bei Geräten, 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 die maximale Menge an Speicher. Geräte, die auf Android 14 und höher aktualisiert werden, können diese Option ebenfalls nutzen, um die vollen Vorteile in Bezug auf den Speicher zu nutzen.
  • Bei Geräten, 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 Speicher gespart wie mit der vorherigen Option.

In den folgenden beiden Abschnitten wird erläutert, wie Sie die einzelnen Optionen implementieren.

Composer HAL 3.2 API implementieren

Um die vollen Vorteile in Bezug auf den Grafikpufferspeicher zu nutzen, 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 Puffer-Cache-Einträge leeren.

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

Abwärtskompatible Option aktivieren

Bei der abwärtskompatiblen Option zur Speicherreduzierung wird ein echter Puffer im Cache-Slot durch einen 1 × 1-Platzhalterpuffer ersetzt. Dadurch wird Speicher für alle geleerten Slots gespart, mit Ausnahme des aktuell aktiven Puffer-Slots. Um teilweise Speicher zu sparen, aktivieren Sie die abwärtskompatible Option, indem Sie die Sysprop surface_flinger.clear_slots_with_set_layer_buffer auf true setzen. Diese Sysprop befindet sich in der property_contexts Datei.

Wenn Sie diese Sysprop 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. Jeder BufferCommand enthält ein 1 × 1-Platzhalterpuffer-Handle und eine Slotnummer für den Cache-Puffer-Slot, 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-Platzhalterpuffer-Handle und eine Slotnummer für den Cache-Puffer-Slot, der geleert werden muss.

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

Speicherverbrauch des Grafikpuffer-Caches testen

Mit Tests lässt sich nicht prüfen, ob HAL-Implementierungen die Cache-Slots leeren. Sie können jedoch Ihre Debugging-Tools verwenden, um die Nutzung des Grafikpuffers zu beobachten. Dabei stellen Sie möglicherweise fest, dass in Szenarien, in denen mehrere verschiedene Videos auf YouTube schnell beendet und gestartet werden, weniger Fehler aufgrund von zu wenig Arbeitsspeicher auftreten.

Es sind VTS-Tests verfügbar, mit denen geprüft wird, ob die HAL-Implementierung die neuen API-Aufrufe (HAL-Version 3.2 oder höher) oder mehrere setLayerBuffer-Befehle für die abwärtskompatible Implementierung funktional empfangen kann. Dies sollte jedoch nicht als ausreichender Test für die ordnungsgemäße Funktion betrachtet werden, da einige Geräte diese VTS-Tests bestehen, aber bei der Verwendung in der Praxis Fehler auftreten.

Neue VTS-Tests finden Sie unter den folgenden Links: