Dans la pile graphique, un cache de tampon par couche se trouve entre le HAL Composer et SurfaceFlinger pour réduire les frais généraux associés à l'envoi de descripteurs de fichiers via l'IPC. Avant Android 14, ce cache de tampon n'était pas purgé lorsqu'un GraphicBufferProducer
se déconnectait d'un GraphicBufferConsumer
SurfaceFlinger, par exemple lorsqu'un MediaCodec est déconnecté d'un SurfaceView. À partir d'Android 14, vous pouvez purger de force ce cache de tampon pour réduire la consommation de mémoire graphique.
Choisissez l'une des deux options suivantes:
- Pour les appareils lancés avec Android 14 ou version ultérieure, vous devez implémenter la nouvelle version 3.2 de l'API HAL Composer. Cette option est activée par défaut et économise le plus de mémoire. Les appareils qui passent à la version 14 ou ultérieure peuvent également utiliser cette option pour profiter pleinement de la mémoire.
- Pour les appareils qui passent à Android 14 pour lesquels vous ne souhaitez pas implémenter l'API Composer HAL 3.2, vous pouvez activer l'option rétrocompatible. Cette option permet d'économiser 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 profiter pleinement de la mémoire tampon graphique, vous devez:
- Mettez à jour votre implémentation du HAL Composer vers la version 3.2.
- Traitez
LayerCommand::bufferSlotsToClear
en purgeant les entrées de cache de tampon indiquées par les numéros d'emplacements trouvés dans la liste.
Les API Composer HAL 3.2 liées à la mémoire de tampon graphique, y compris LayerCommand:bufferSlotsToClear
, se trouvent dans LayerCommand.aidl-
.
Activer l'option rétrocompatible
L'option de réduction de la mémoire rétrocompatible remplace un tampon réel dans l'emplacement de cache par un tampon d'espace réservé 1x1, ce qui permet d'économiser de la mémoire pour tous les emplacements purgés, à l'exception de l'emplacement de tampon actif actuel. Pour bénéficier d'une économie de mémoire partielle, activez l'option rétrocompatible en définissant la propriété système surface_flinger.clear_slots_with_set_layer_buffer
sur true
. Ce sysprop se trouve dans le fichier property_contexts
.
Le fait de définir cette propriété système nécessite que votre implémentation HAL de Composer gère correctement plusieurs commandes setLayerBuffer
pour la même couche dans un seul cycle de présentation.
L'activation de l'option rétrocompatible a les effets suivants:
Pour les HAL AIDL: SurfaceFlinger envoie plusieurs instances
LayerCommand
pour une seule couche, chacune avec un seulBufferCommand
. ChaqueBufferCommand
contient un gestionnaire de tampon d'espace réservé 1x1 et un numéro de slot pour le slot de tampon de cache à purger.Pour les HAL HIDL: SurfaceFlinger envoie plusieurs commandes
SELECT_DISPLAY
,SELECT_LAYER
etSET_BUFFER
. Ces commandes contiennent un gestionnaire de tampon d'espace réservé 1x1 et un numéro d'emplacement pour l'emplacement de tampon de cache à purger.
L'option rétrocompatible peut entraîner le plantage du HAL Composer sur certains appareils. Vous pouvez peut-être modifier votre HAL Composer pour résoudre ce problème. Le code contrôlant ce comportement est disponible ici:
Tester la consommation de mémoire du cache de la mémoire tampon graphique
Les tests ne peuvent pas vérifier si les emplacements de cache sont supprimés définitivement par les implémentations HAL. Toutefois, vous pouvez utiliser vos outils de débogage pour surveiller l'utilisation du tampon graphique. En surveillant votre flux, vous devriez constater qu'il y a moins d'erreurs de mémoire insuffisante dans les cas où plusieurs vidéos différentes sont arrêtées et démarrées rapidement 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 (version 3.2 ou ultérieure de HAL) ou plusieurs commandes setLayerBuffer
pour l'implémentation rétrocompatible. Toutefois, cela ne doit pas être considéré comme un test suffisant pour une fonctionnalité appropriée, 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:
Compatibilité HIDL:
GraphicsComposerHidlCommandTest::SET_LAYER_BUFFER_multipleTimes
Compatibilité avec AIDL 3.1:
GraphicsComposerAidlCommandTest::SetLayerBufferMultipleTimes
AIDL 3.2:
GraphicsComposerAidlCommandV2Test::SetLayerBufferSlotsToClear