Mise en mémoire tampon des images de l'appareil photo

Ajoutée dans ARCore 1.17.0

La plupart des applications ne doivent mettre en mémoire tampon qu'un seul cadre d'appareil photo pour le rendu. Cependant, ARCore accepte également la mise en mémoire tampon de plusieurs images de caméra dans une file d'attente de texture round robin de taille fixe.

Les applications dotées d'un pipeline de rendu multithread peuvent utiliser la mise en mémoire tampon pour améliorer les performances de rendu. La mise en mémoire tampon peut également aider les applications à afficher les frames à une fréquence de frames plus cohérente, ce qui peut réduire le stuttering visuel causé par le lenteur de l'affichage de l'interface utilisateur.

Conditions préalables

La mise en mémoire tampon des images de l'appareil photo s'active dans l'une des conditions suivantes:

  1. Lorsque l'option est activée par l'application, appelez Session.setCameraTextureNames(ids) avec plusieurs ID de texture.

  2. Lorsqu'une ou plusieurs fonctionnalités ARCore nécessitant une mise en mémoire tampon interne sont activées. Actuellement, cela inclut les fonctionnalités suivantes:

    • Images augmentées
    • Visages augmentés
  3. Sur certains appareils compatibles avec ARCore qui nécessitent une mise en mémoire tampon interne pour fonctionner correctement.

Déterminer si le délai d'affichage est activé

Pour déterminer si la mise en mémoire tampon du frame (également appelée "délai de frame") est activée sur un appareil et une session de RA donnés, utilisez la sortie logcat adb:

# Camera frame buffering is turned off when frame delay is zero.
adb logcat | grep 'Update Frame Delay'
… I native  : session.cc:3141 Update Frame Delay to 0 frames.
# Camera frame buffering is turned on when frame count is non-zero.
# Note: The size of the buffer can vary over time.
adb logcat | grep 'Update Frame Delay'
… I native  : session.cc:3141 Update Frame Delay to 6 frames.

… I native  : session.cc:3141 Update Frame Delay to 4 frames.

… I native  : session.cc:3141 Update Frame Delay to 2 frames.

Mémoire

Chaque frame de caméra mis en mémoire tampon augmente l'utilisation de la mémoire. Par exemple, une texture 1080p utilise environ 6 Mo de mémoire (obtenu en multipliant une résolution de 1 920 x 1 080 par trois octets de données RVB par pixel).

Considérations sur les performances

L'utilisation de plusieurs images de caméra ne garantit pas de réduire la variabilité des fréquences d'images, et l'utilisation d'un pipeline de rendu multithread ne garantit pas de meilleures performances en toutes circonstances. Les facteurs suivants affectent les performances réelles:

  • Pipeline de rendu des applications

  • Modèle de thread d'application

  • Architecture du processeur de l'appareil

  • Le système de planification du système d'exploitation

Si votre application ne peut pas tirer parti d'images supplémentaires, le fait d'utiliser plusieurs textures ne présente aucun avantage en termes de performances.

Activer la mise en mémoire tampon

Pour indiquer à ARCore les textures à utiliser pour mettre en mémoire tampon les images de l'appareil photo entrantes, utilisez Session.setCameraTextureNames(ids) afin de fournir un tableau d'un ou plusieurs ID de texture. Cette fonction n'est appelée qu'après la création de la session et n'est généralement appelée qu'une seule fois.

Lors de chaque appel de Session.update(), ARCore écrase la texture suivante dans la file d'attente selon une séquence à tour de rôle. Si votre application ne définit qu'un seul ID de texture, la même texture sera écrasée à chaque fois.

Utilisez Frame.getCameraTextureName() pour déterminer l'ID de texture associé à l'image actuelle.