Réduire la consommation de mémoire graphique

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:

  1. Mettez à jour votre implémentation du HAL Composer vers la version 3.2.
  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 seul BufferCommand. Chaque BufferCommand 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 et SET_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: