Dans la pile graphique, un cache tampon par couche se trouve entre Composer HAL et SurfaceFlinger pour réduire la surcharge associée à l'envoi de descripteurs de fichiers via IPC. Avant Android 14, ce cache tampon n'était pas purgé lorsqu'un GraphicBufferProducer
se déconnectait d'un SurfaceFlinger GraphicBufferConsumer
, par exemple lorsqu'un MediaCodec était déconnecté d'un SurfaceView. À partir d’Android 14, vous pouvez purger de force ce cache tampon pour réduire la consommation de mémoire graphique.
Choisissez parmi l'une des deux options suivantes :
- Pour les appareils lancés avec Android 14 et versions ultérieures, vous devez implémenter la nouvelle API Composer HAL version 3.2. Cette option est activée par défaut et économise le plus de mémoire. Les appareils mis à niveau vers la version 14 et ultérieure peuvent également utiliser cette option pour bénéficier de tous les avantages de la mémoire.
- Pour les appareils mis à niveau vers Android 14 pour lesquels vous ne souhaitez pas implémenter l'API Composer HAL 3.2, vous pouvez activer l'option de compatibilité ascendante. Cette option économise presque autant de mémoire que l’option précédente.
Les deux sections suivantes expliquent comment implémenter chaque option.
Implémenter l'API Composer HAL 3.2
Pour bénéficier pleinement des avantages de la mémoire tampon graphique, vous devez :
- Mettez à jour votre implémentation Composer HAL vers la version 3.2.
- Traitez
LayerCommand::bufferSlotsToClear
en purgeant les entrées du cache de tampon indiquées par les numéros d’emplacement trouvés dans la liste.
Les API Composer HAL 3.2 liées à la mémoire tampon graphique, y compris LayerCommand:bufferSlotsToClear
, se trouvent dans LayerCommand.aidl-
.
Activer l'option de compatibilité ascendante
L'option de réduction de mémoire rétrocompatible remplace un tampon réel dans l'emplacement de cache par un tampon d'espace réservé 1x1, ce qui entraîne des économies de mémoire pour tous les emplacements purgés, à l'exception de l'emplacement de tampon actif actuel. Pour obtenir des avantages d'économie de mémoire partielle, activez l'option de compatibilité ascendante en définissant le sysprop surface_flinger.clear_slots_with_set_layer_buffer
sur true
. Ce sysprop se trouve dans le fichier property_contexts
.
La définition de ce sysprop nécessite que votre implémentation Composer HAL gère correctement plusieurs commandes setLayerBuffer
pour la même couche dans un seul cycle actuel.
L'activation de l'option de compatibilité ascendante a les effets suivants :
Pour les HAL AIDL : SurfaceFlinger envoie plusieurs instances
LayerCommand
pour une seule couche, chacune avec un seulBufferCommand
. ChaqueBufferCommand
contient un handle de tampon d'espace réservé 1x1 et un numéro d'emplacement pour l'emplacement de tampon de cache qui doit être purgé.Pour les HAL HIDL : SurfaceFlinger envoie plusieurs commandes
SELECT_DISPLAY
,SELECT_LAYER
,SET_BUFFER
. Ces commandes contiennent un handle de tampon d'espace réservé 1x1 et un numéro d'emplacement pour l'emplacement de tampon de cache qui doit être purgé.
L'option de compatibilité ascendante peut entraîner le blocage de Composer HAL sur certains appareils. Vous pourrez peut-être modifier votre Composer HAL pour résoudre ce problème. Le code contrôlant ce comportement se trouve ici :
Tester la consommation de mémoire cache du tampon graphique
Les tests ne peuvent pas vérifier si les emplacements de cache sont purgés par les implémentations HAL. Cependant, vous pouvez utiliser vos outils de débogage pour surveiller l'utilisation du tampon graphique. Pendant que vous surveillez, vous remarquerez qu'il y a moins d'erreurs de manque de mémoire dans les scénarios où plusieurs vidéos différentes sont arrêtées et démarrées en succession rapide sur YouTube.
Des tests VTS sont disponibles pour vérifier que l'implémentation HAL est fonctionnellement capable de recevoir les nouveaux appels d'API (HAL version 3.2+) ou plusieurs commandes setLayerBuffer
pour l'implémentation rétrocompatible. Cependant, cela ne doit pas être considéré comme un test suffisant pour garantir un bon fonctionnement, car certains appareils réussissent ces tests VTS, mais échouent dans des cas d'utilisation réels.
Pour les nouveaux tests VTS, accédez aux liens suivants :
Compatible HIDL :
GraphicsComposerHidlCommandTest::SET_LAYER_BUFFER_multipleTimes
Compatible AIDL 3.1 :
GraphicsComposerAidlCommandTest::SetLayerBufferMultipleTimes
AIDL 3.2 :
GraphicsComposerAidlCommandV2Test::SetLayerBufferSlotsToClear