Comprendre les performances de la réalité mixte

Cet article est une introduction à la compréhension de l’importance des performances pour votre application Mixed Reality. L’expérience utilisateur peut être considérablement dégradée si votre application ne s’exécute pas à une fréquence d’images optimale. Hologrammes apparaît instable et le suivi de la tête de l’environnement est incorrect, ce qui entraîne une mauvaise expérience pour l’utilisateur. Les performances doivent être considérées comme une fonctionnalité de première classe pour le développement de réalité mixte et non comme une tâche polie.

Les valeurs de fréquence d’images performantes pour chaque plateforme cible sont répertoriées ci-dessous.

Plateforme Fréquence d’images cible
HoloLens 60 i/s
PC Windows Mixed Reality Ultra 90 FPS
PC Windows Mixed Reality 60 i/s

L’infrastructure ci-dessous décrit les meilleures pratiques pour atteindre les taux d’images cibles. Pour obtenir des conseils sur la mesure et l’amélioration de la fréquence d’images dans l’environnement Unity, nous vous recommandons de lire les recommandations en matière de performances pour l’article Unity

Présentation des goulots d’étranglement des performances

Si votre application a un débit d’images sous-performant, la première étape consiste à analyser et à comprendre où votre application est gourmande en ressources de calcul. Il existe deux processeurs principaux responsables du travail de rendu de votre scène : le processeur et le GPU, chacun gérant différents aspects de votre application Mixed Reality. Les trois endroits clés où les goulots d’étranglement peuvent se produire sont les suivants :

  1. Thread d’application - PROCESSEUR - Responsable de votre logique d’application, y compris le traitement des entrées, des animations, de la physique et d’autres logiques d’application.
  2. Thread de rendu - PROCESSEUR sur GPU - Responsable de l’envoi de vos appels de dessin au GPU. Lorsque votre application souhaite afficher un objet tel qu’un cube ou un modèle, ce thread envoie une demande au GPU pour effectuer les opérations.
  3. GPU : gère le pipeline graphique de votre application pour transformer des données 3D (modèles, textures, et ainsi de suite) en pixels. Il produit finalement une image 2D à envoyer à l’écran de votre appareil.

Lifetime of a Frame

En règle générale, HoloLens applications seront liées au GPU, mais pas toujours. Utilisez les outils et techniques ci-dessous pour comprendre où votre application particulière est goulot d’étranglement.

Comment analyser votre application

Il existe de nombreux outils qui vous permettent de comprendre le profil de performances et les goulots d’étranglement potentiels dans votre application de réalité mixte.

Voici quelques outils courants pour vous aider à collecter des informations de profilage approfondies pour votre application :

Comment profiler dans n’importe quel environnement

Une façon de déterminer si votre application est liée au GPU ou au processeur consiste à réduire la résolution de la sortie de la cible de rendu. En réduisant le nombre de pixels à calculer, vous réduisez votre charge GPU. L’appareil s’affiche sur une texture plus petite, puis un exemple up pour afficher votre image finale.

Après avoir réduit la résolution de rendu, si :

  1. Augmentation de la fréquence d’images de l’application, vous êtes probablement lié au GPU
  2. Fréquence d’images de l’application inchangée, vous êtes probablement lié au processeur

Notes

Unity offre la possibilité de modifier facilement la résolution de la cible de rendu de votre application au moment de l’exécution grâce à la propriété XRSettings.renderViewportScale. L’image finale présentée sur l’appareil a une résolution fixe. La plateforme échantillonne la sortie de résolution inférieure pour générer une image de résolution supérieure pour le rendu sur les écrans.

UnityEngine.XR.XRSettings.renderScale = 0.7f;

Comment améliorer votre application

Recommandations sur les performances de processeur

En règle générale, la plupart des travaux dans une application de réalité mixte sur le processeur impliquent d’effectuer la « simulation » de la scène et de traiter votre logique d’application. Les domaines suivants sont ciblés pour l’optimisation :

  • Animations
  • Physique
  • Allocations de mémoire
  • Algorithmes complexes (c’est-à-dire des kinematics inverses, recherche de chemin d’accès)

Recommandations sur les performances de GPU

Comprendre la bande passante et le taux de remplissage

Pour restituer une trame sur le processeur graphique, une application dépend de la bande passante de mémoire ou du taux de remplissage.

  • La bande passante de mémoire est le débit des lectures et des écritures que peut avoir le processeur graphique à partir de la mémoire
    • Pour identifier les limitations de bande passante, réduisez la qualité de texture et vérifiez si la fréquence d’images a été améliorée.
    • Pour identifier les limitations de taux de remplissage, réduisez la résolution d’affichage et voyez si la fréquence d’images s’améliore.

Notes

Si vous utilisez Unity, consultez nos recommandations de performances GPU spécifiques à Unity. - Dans Unity, utilisez la propriété XRSettings.renderViewportScale

La bande passante mémoire implique généralement des optimisations pour :

  1. Résolutions de texture inférieures
  2. Utilisez moins de textures (normales, spéculaires, et ainsi de suite)

Le taux de remplissage est axé sur la réduction du nombre d’opérations qui doivent être calculées pour un pixel rendu final, notamment :

  1. Nombre d’objets à restituer/traiter
  2. Nombre d’opérations par nuanceur
  3. Nombre d’étapes GPU au résultat final (nuanceurs géométriques, effets post-traitement, et ainsi de suite)
  4. Nombre de pixels à afficher (résolution d’affichage)

Réduire le nombre de polygones

Un nombre de polygones plus élevé entraîne davantage d’opérations pour le GPU, ce qui réduit le nombre de polygones dans votre scène réduit le temps de rendu. Il existe d’autres facteurs qui rendent l’ombrage de la géométrie coûteuse, mais le nombre de polygones est la métrique la plus simple pour déterminer le travail nécessaire pour restituer une scène.

Limiter le surdessin

Le surdraw élevé se produit lorsque plusieurs objets sont affichés mais non affichés à l’écran, car ils sont masqués par un objet occluding. Imagine regarder un mur qui a des objets derrière lui. Toute la géométrie serait traitée pour le rendu, mais seul le mur opaque doit être rendu, ce qui entraîne des opérations inutiles.

Nuanceurs

Les nuanceurs sont de petits programmes qui s’exécutent sur le GPU et effectuent deux étapes importantes dans le rendu :

  1. Détermination des sommets à dessiner et où ils se trouvent dans l’espace d’écran (nuanceur de vertex)
    • Le nuanceur de vertex est exécuté par vertex pour chaque maillage.
  2. Détermination de la couleur de chaque pixel (nuanceur de pixels)
    • Le nuanceur de pixels est exécuté par pixel et rendu par la géométrie sur la texture de rendu cible.

En règle générale, les nuanceurs effectuent de nombreuses transformations et calculs d’éclairage. Bien que des modèles d’éclairage complexes, des ombres et d’autres opérations puissent générer des résultats fantastiques, ils sont également fournis avec un prix. La réduction du nombre d’opérations calculées dans les nuanceurs peut réduire considérablement le travail nécessaire pour le GPU par trame.

Recommandations de codage du nuanceur
  • Utiliser le filtrage biligne, dans la mesure du possible
  • Réorganiser les expressions pour utiliser des intrinsèques MAD pour effectuer une multiplication et un ajout en même temps
  • Précalculer autant que possible sur le processeur et passer autant de constantes au matériau
  • Favoriser le déplacement des opérations du nuanceur de pixels vers le nuanceur de vertex
    • En règle générale, le nombre de sommets est beaucoup plus petit que le nombre de pixels (720p est de 921 600 pixels, 1080p est de 2 073 600 pixels, et ainsi de suite)

Supprimer les étapes du GPU

Les effets post-traitement peuvent être coûteux et augmenter le taux de remplissage de votre application, y compris les techniques d’anticrénelage comme MSAA. Sur HoloLens, nous vous recommandons d’éviter ces techniques et d’autres étapes de nuanceur telles que la géométrie, la coque et les nuanceurs de calcul.

Recommandations sur la mémoire

Les opérations d’allocation de mémoire et de désallocation excessives peuvent entraîner des performances incohérentes, des images figées et d’autres comportements nuisibles. Il est particulièrement important de comprendre les considérations relatives à la mémoire lors du développement dans Unity, car la gestion de la mémoire est contrôlée par le récupérateur de mémoire.

Mise en pool d’objets

Le regroupement d’objets est une technique populaire pour réduire le coût des allocations continues et des désallocations d’objets. Pour la réaliser, vous devez allouer un grand pool d’objets identiques et réutiliser des instances inactives disponibles de ce pool au lieu de générer et détruire constamment des objets au fil du temps. Les pools d’objets conviennent parfaitement aux composants réutilisables qui ont une durée de vie variable pendant une application.

Voir aussi