Analyser les formats de sommets

Vous pouvez diagnostiquer certains problèmes de performances liés aux sommets à l'aide du profilage des frames. Utilisez le volet Commandes pour afficher tous les appels de dessin effectués par votre jeu dans un frame donné, ainsi que le nombre de primitives dessinées par appel de dessin. Cela peut donner une approximation du nombre total de sommets soumis dans un seul frame.

Vue du profilage des frames pour un appel glDrawElements, avec un pointeur sur les paramètres de l'appel de dessin pour plus de détails
Figure 1 Vue du profilage de frame pour un seul appel glDrawElements, montrant 2 718 primitives de triangle dessinées

Compression des attributs de vertex

Un problème courant que votre jeu peut rencontrer est une taille moyenne de vertex élevée. Un grand nombre de sommets envoyés avec une taille de sommet moyenne élevée entraîne une grande bande passante de lecture de la mémoire des sommets lorsqu'ils sont lus par le GPU.

Pour observer le format des sommets pour un appel de dessin donné, procédez comme suit :

  1. Sélectionnez un appel de dessin qui vous intéresse.

    Il peut s'agir d'un appel de dessin typique pour la scène, d'un appel de dessin avec un grand nombre de sommets, d'un appel de dessin pour un modèle de personnage complexe ou d'un autre type d'appel de dessin.

  2. Accédez au volet Pipeline, puis cliquez sur IA pour l'assemblage des entrées. Cela définit le format des sommets entrant dans le GPU.

  3. Observez une série d'attributs et leurs formats. Par exemple, R32G32B32_SFLOAT est un float signé de 32 bits à trois composants.

Vue du profilage de frame pour l'assemblage d'entrée d'un appel de dessin, avec des attributs de vertex non compressés
Figure 2. Assemblage d'entrée pour un appel de dessin, avec des attributs non compressés entraînant une taille de vertex de 56 octets

Les attributs de vertex peuvent souvent être compressés avec une réduction minimale de la qualité des modèles dessinés. En particulier, nous vous recommandons de :

  • Compression de la position des sommets en valeurs à virgule flottante 16 bits de demi-précision
  • Compression des coordonnées UV de texture en ushorts (entiers non signés de 16 bits)
  • Compression de l'espace tangent en encodant les vecteurs normaux, tangents et binormaux à l'aide de quaternions

D'autres attributs divers peuvent également être pris en compte pour les types de précision inférieure, au cas par cas.

Fractionnement du flux de sommets

Vous pouvez également vérifier si les flux d'attributs de vertex sont correctement fractionnés. Sur les architectures de rendu par blocs, telles que les GPU mobiles, les positions des sommets sont d'abord utilisées dans une passe de binning pour créer des bins de primitives traitées dans chaque bloc. Si les attributs de vertex sont entrelacés dans un seul tampon, toutes les données de vertex sont lues dans le cache pour le binning, même si seules les positions de vertex sont utilisées.

Pour réduire la bande passante de la mémoire de lecture des sommets et améliorer l'efficacité du cache, et donc réduire le temps passé sur la passe de binning, les données de sommet doivent être divisées en deux flux distincts : un pour les positions des sommets et un pour tous les autres attributs de sommet.

Pour vérifier si les attributs de vertex sont correctement fractionnés :

  1. Sélectionnez un appel de dessin qui vous intéresse et notez son numéro.

    Il peut s'agir d'un appel de dessin typique pour la scène, d'un appel de dessin avec un grand nombre de sommets, d'un appel de dessin pour un modèle de personnage complexe ou d'un autre type d'appel de dessin.

  2. Accédez au volet Pipeline, puis cliquez sur IA pour l'assemblage des entrées. Cela définit le format des sommets entrant dans le GPU.

  3. Observez les liaisons de vos attributs de vertex. Elles peuvent généralement augmenter de manière linéaire (0, 1, 2, 3, etc.), mais ce n'est pas toujours le cas. La position du sommet est généralement le premier attribut de sommet listé.

  4. Dans le volet État, recherchez LastDrawInfos et développez le numéro d'appel de tirage correspondant. Développez ensuite le BoundVertexBuffers pour cet appel de dessin.

  5. Observez les tampons de vertex liés lors de l'appel de dessin donné, avec des index correspondant aux liaisons d'attributs de vertex précédentes.

  6. Développez les liaisons pour les attributs de vertex de votre appel de dessin, puis développez les tampons.

  7. Observez VulkanHandle pour les tampons, qui représentent la mémoire sous-jacente à partir de laquelle les sources de données de vertex sont issues. Si les VulkanHandle sont différents, cela signifie que les attributs proviennent de différents tampons sous-jacents. Si les VulkanHandle sont identiques, mais que les décalages sont importants (par exemple, supérieurs à 100), les attributs peuvent toujours provenir de différents sous-tampons, mais cela nécessite une analyse plus approfondie.

Vue du profilage de frame pour l'assemblage d'entrée et l'état d'un appel de dessin montrant le tampon de vertex lié
Figure 3. Assemblage d'entrée pour un appel de dessin, avec le panneau d'état à droite montrant que les attributs à la liaison 0 et 1, la position et la normale du vertex, partagent un seul tampon sous-jacent

Pour en savoir plus sur la division des flux de vertex et sur la manière de résoudre ce problème sur différents moteurs de jeu, consultez notre article de blog sur le sujet.