Réduire les superpositions

Cette page explique ce qu'est la superposition, comment la diagnostiquer et comment la supprimer ou l'atténuer.

Lorsqu'une application dessine le même pixel plusieurs fois dans un seul frame, on parle de superposition. Les superpositions sont généralement inutiles et il est préférable de les supprimer. La superposition devient un problème de performances lorsqu'elle fait perdre du temps au GPU pour afficher des pixels qui ne contribuent pas à ce que l'utilisateur voit à l'écran.

À propos des superpositions

Une superposition désigne le dessin d'un pixel affiché plusieurs fois à l'écran dans un seul frame d'affichage. Par exemple, si plusieurs cartes d'interface sont empilées, chacune d'elles masque une partie de celle en dessous. Toutefois, le système doit toujours dessiner les parties masquées des cartes de la pile. En effet, les cartes empilées sont affichées selon l'algorithme du peintre, c'est-à-dire dans l'ordre initial. Cette séquence d'affichage permet au système d'appliquer une combinaison alpha appropriée à des objets translucides tels que des ombres.

Identifier les problèmes de superposition

La plate-forme propose les outils suivants pour vous aider à déterminer si les superpositions affectent les performances de votre application.

Outil de débogage de superposition GPU

L'outil de débogage de superposition GPU utilise un code couleur pour indiquer le nombre de fois où votre application dessine chaque pixel à l'écran. Plus ce nombre est élevé, plus il est probable que les superpositions affectent les performances de votre application.

Pour en savoir plus, consultez la section Visualiser la superposition GPU.

Outil de rendu GPU du profil

L'outil de rendu GPU du profil affiche le temps nécessaire à chaque étape du pipeline de rendu pour afficher un seul frame sous forme d'histogramme à faire défiler. La partie Traitement de chaque barre (en orange) indique à quel moment le système échange des tampons. Cette métrique fournit des indications importantes sur les superpositions.

Sur les GPU moins performants, le taux de remplissage disponible (la vitesse à laquelle le GPU peut remplir le tampon du frame) peut être assez faible. À mesure que le nombre de pixels requis pour dessiner un frame augmente, le GPU peut mettre plus de temps à traiter les nouvelles commandes et demander au reste du système d'attendre que le retard soit rattrapé. La barre Traitement montre que ce pic se produit lorsque le GPU est surchargé en essayant de dessiner des pixels aussi vite que possible. Ce pic de métrique peut aussi être causé par d'autres problèmes que le nombre brut de pixels. Par exemple, si l'outil de débogage de superposition GPU affiche une forte superposition et des pics de traitement, il y a probablement un problème de superposition.

Pour en savoir plus, consultez Profiler la vitesse du rendu GPU.

Corriger la superposition

Vous pouvez effectuer les opérations suivantes pour réduire ou supprimer les superpositions :

  • Supprimer les arrière-plans inutiles dans les mises en page.
  • Réduire la transparence.

Cette section fournit des informations sur ces deux approches.

Supprimer les arrière-plans inutiles dans les mises en page

Par défaut, une mise en page n'a pas d'arrière-plan, ce qui signifie qu'elle n'affiche rien directement elle-même. Toutefois, lorsque les mises en page comportent des arrière-plans, elles peuvent contribuer à une superposition.

Vous pouvez améliorer les performances d'affichage en supprimant les arrière-plans inutiles, par exemple un arrière-plan qui n'est pas visible, car il est entièrement recouvert par tout ce que l'application dessine dessus. Par exemple, un enfant Box ou une mise en page avec un modificateur .background peut couvrir complètement l'arrière-plan d'un conteneur parent, ce qui rend le passage de dessin du parent entièrement invisible pour l'utilisateur, mais toujours entièrement traité par le GPU.

Pour savoir pourquoi vous avez des superpositions, examinez l'arborescence des composants dans l'outil Layout Inspector. Vous pouvez rechercher les arrière-plans non visibles par l'utilisateur et les supprimer. Vous pouvez également supprimer les arrière-plans inutiles chaque fois que plusieurs conteneurs partagent une couleur d'arrière-plan. Définissez l'arrière-plan de la fenêtre sur la couleur d'arrière-plan principale de votre application et laissez tous les conteneurs au-dessus sans valeur d'arrière-plan définie.

Réduire la transparence

Le rendu des pixels transparents à l'écran, également appelé rendu alpha, est un facteur clé de la superposition. Contrairement aux superpositions standards, dans lesquelles le système masque complètement les pixels tracés existants en dessinant des pixels opaques dessus, les objets transparents nécessitent d'abord de dessiner les pixels existants afin que l'équation de combinaison adéquate puisse se produire.

Les effets visuels, tels que les animations transparentes, les fondus et les ombres projetées, impliquent un certain degré de transparence et peuvent donc contribuer de manière significative à la superposition. Vous pouvez améliorer le superposition dans ces situations en réduisant le nombre d'objets transparents que vous affichez. Par exemple, vous pouvez obtenir du texte gris en dessinant du texte noir dans un Text composable et en appliquant une valeur alpha translucide à l'aide de modifier = Modifier.alpha(0.5f). Toutefois, vous pouvez obtenir le même effet avec de meilleures performances en définissant directement la couleur du texte du composable sur un gris opaque : color = Color.Black.copy(alpha = 0.5f).

Pour en savoir plus sur les coûts de performances imposés par la transparence tout au long du pipeline de dessin, regardez la vidéo Coûts cachés de la transparence.