Im Grafikstack befindet sich zwischen Composer HAL und SurfaceFlinger ein schichtspezifischer Puffercache, um den Overhead beim Senden von Dateideskriptoren über IPC zu reduzieren. Vor Android 14 wurde dieser Puffercache nicht geleert, wenn eine GraphicBufferProducer
-Instanz die Verbindung zu einem SurfaceFlinger GraphicBufferConsumer
trennte, z. B. wenn ein MediaCodec von einer SurfaceView getrennt wurde. Ab Android 14 können Sie diesen Puffercache erzwungen leeren, um die Grafikspeichernutzung zu reduzieren.
Wählen Sie eine der folgenden Optionen aus:
- Für Geräte, die mit Android 14 oder 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. Auch auf Geräten, die auf Android 14 oder höher umgestellt werden, kann diese Option genutzt werden, um den Arbeitsspeicher optimal zu nutzen.
- Für Geräte, die auf Android 14 umgestellt 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 erläutert, wie die einzelnen Optionen implementiert werden.
Composer HAL 3.2 API implementieren
Damit Sie alle Vorteile des Grafik-Framebuffer-Arbeitsspeichers nutzen können, müssen folgende Voraussetzungen erfüllt sein:
- Aktualisieren Sie Ihre Composer HAL-Implementierung auf Version 3.2.
- Bearbeiten Sie
LayerCommand::bufferSlotsToClear
, indem Sie die Buffer-Cache-Einträge löschen, die durch die in der Liste angegebenen Steckplatznummern gekennzeichnet sind.
Die Composer HAL 3.2 APIs, die sich auf den Grafik-Buffer-Speicher beziehen, einschließlich LayerCommand:bufferSlotsToClear
, finden Sie unter LayerCommand.aidl-
.
Backward-Compatible-Option aktivieren
Bei der rückwärtskompatiblen Speicherreduzierungsoption wird ein echter Puffer im Cache-Steckplatz durch einen Platzhalter-Puffer mit einer Größe von 1 × 1 ersetzt. Dadurch wird Speicherplatz für alle gelöschten Slots gespart, mit Ausnahme des aktuell aktiven Puffer-Slots. Wenn Sie teilweise Speichereinsparungen erzielen möchten, aktivieren Sie die abwärtskompatible Option, indem Sie die surface_flinger.clear_slots_with_set_layer_buffer
-Sysprop auf true
setzen. Diese Sysprop-Datei befindet sich in der Datei property_contexts
.
Wenn Sie dieses Sysprop festlegen, muss Ihre Composer HAL-Implementierung mehrere setLayerBuffer
-Befehle für dieselbe Schicht in einem einzigen 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, jede mit einer einzelnenBufferCommand
. JedeBufferCommand
enthält einen 1 × 1-Platzhalter-Puffer-Handle und eine Steckplatznummer für den Cache-Puffer-Steckplatz, der gelöscht werden muss.Für HIDL HALs: SurfaceFlinger sendet mehrere
SELECT_DISPLAY
-,SELECT_LAYER
- undSET_BUFFER
-Befehle. Diese Befehle enthalten einen 1:1-Platzhalter-Puffer-Handle und eine Steckplatznummer für den Cache-Puffer-Steckplatz, der gelöscht werden muss.
Die rückwärtskompatible Option kann dazu führen, dass die HAL von Composer 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:
Arbeitsspeicherverbrauch des Grafik-Buffer-Caches testen
Mit Tests kann nicht überprü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. Bei der Überwachung sollten Sie feststellen, dass es in Szenarien, in denen mehrere verschiedene Videos auf YouTube in schneller Folge angehalten und gestartet werden, weniger Fehlermeldungen wegen fehlendem Arbeitsspeicher gibt.
Es sind VTS-Tests verfügbar, mit denen überprüft wird, ob die HAL-Implementierung die neuen API-Aufrufe (HAL-Version 3.2 und höher) oder mehrere setLayerBuffer
-Befehle für die abwärtskompatible Implementierung empfangen kann. 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 versagen.
Für neue VTS-Tests rufen Sie die folgenden Links auf:
HIDL-kompatibel:
GraphicsComposerHidlCommandTest::SET_LAYER_BUFFER_multipleTimes
Kompatibel mit AIDL 3.1:
GraphicsComposerAidlCommandTest::SetLayerBufferMultipleTimes
AIDL 3.2:
GraphicsComposerAidlCommandV2Test::SetLayerBufferSlotsToClear