Comprendre les performances de la réalité mixteUnderstanding performance for mixed reality

Cet article est une introduction à la compréhension de l’importance des performances de votre application de réalité mixte.This article is an introduction to understanding the significance of performance for your Mixed Reality app. L’expérience utilisateur peut être très détériorée si votre application n’est pas exécutée à la fréquence d’images optimale.User experience can be greatly degraded if your application doesn't run at optimal frame rate. Les hologrammes apparaissent instables et le suivi des têtes de l’environnement n’est pas exact, ce qui entraîne une mauvaise expérience de l’utilisateur.Holograms will appear unstable and head tracking of the environment will be inaccurate, leading to a poor experience for the user. Les performances doivent être considérées comme une fonctionnalité de première classe pour le développement de la réalité mixte et non pour une tâche polonaise.Performance must be considered a first class feature for mixed reality development and not a polish task.

Nous avons récemment publié une application appelée notions de base de la qualité qui couvre les problèmes courants liés aux performances, à la conception et à l’environnement, ainsi que les solutions pour les applications HoloLens 2.We recently released an application called Quality Fundamentals that covers common performance, design, and environment issues and solutions for HoloLens 2 apps. Cette application est une excellente démonstration visuelle du contenu qui suit.This app is a great visual demo for the content the follows.

Les valeurs de fréquence d’images performante pour chaque plateforme cible sont répertoriées ci-dessous.The performant framerate values for each target platform are listed below.

PlateformePlatform Fréquence d’images cibleTarget Frame Rate
HoloLensHoloLens 60 i/s60 FPS
Windows Mixed Reality ultra PCWindows Mixed Reality Ultra PCs 90 FPS90 FPS
PC Windows Mixed RealityWindows Mixed Reality PCs 60 i/s60 FPS

Le cadre ci-dessous décrit les meilleures pratiques pour atteindre les fréquences d’images cibles.The framework below outlines best practices for hitting target frame rates. Nous vous recommandons de lire les recommandations relatives aux performances de l’article Unity pour obtenir des conseils sur la mesure et l’amélioration de la fréquence d’images dans l’environnement Unity.We recommend reading the performance recommendations for Unity article for tips on measuring and improving framerate in the Unity environment.

Comprendre les goulots d’étranglement des performancesUnderstanding performance bottlenecks

Si votre application comporte une cadence de trames, la première étape consiste à analyser et à comprendre où votre application est gourmande en calculs.If your app has an underperforming framerate, the first step is to analyze and understand where your application is computationally intensive. Deux processeurs principaux sont responsables du travail de rendu de votre scène : le processeur et le GPU, chacun gérant différents aspects de votre application de réalité mixte.There are two primary processors responsible for the work to render your scene: the CPU and the GPU, each handling different aspects of your Mixed Reality app. Les goulots d’étranglement peuvent être les suivants :The three key places where bottlenecks may occur are:

  1. Thread d’application-UC - Responsable de votre logique d’application, y compris le traitement des entrées, des animations, de la physique et d’autres logiques d’application.App Thread - CPU - Responsible for your app logic, including processing input, animations, physics, and other app logic.
  2. Rendu thread-CPU au GPU -responsable de l’envoi des appels de dessin au GPU.Render Thread - CPU to GPU - Responsible for submitting your draw calls to the GPU. Lorsque votre application souhaite effectuer le rendu d’un objet tel qu’un cube ou un modèle, ce thread envoie une demande au GPU pour effectuer les opérations.When your app wants to render an object such as a cube or model, this thread sends a request to the GPU to do the operations.
  3. Le GPU , le plus souvent, gère le pipeline graphique de votre application pour transformer des données 3D (modèles, textures, etc.) en pixels.GPU - Most commonly handles the graphics pipeline of your application to transform 3D data (models, textures, and so on) into pixels. Il produit finalement une image 2D à envoyer à l’écran de votre appareil.It ultimately produces a 2D image to submit to your device's screen.

Durée de vie d’un frame

En règle générale, les applications HoloLens sont liées au GPU, mais pas toujours.Generally, HoloLens applications will be GPU bound, but not always. Utilisez les outils et les techniques ci-dessous pour comprendre où votre application particulière est engorgée.Use the tools and techniques below to understand where your particular app is bottlenecked.

Comment analyser votre applicationHow to analyze your application

De nombreux outils vous permettent de comprendre le profil de performances et les goulots d’étranglement potentiels dans votre application de réalité mixte.There are many tools that allow you to understand the performance profile and potential bottlenecks in your mixed reality application.

Voici quelques outils courants pour vous aider à recueillir des informations de profilage détaillés pour votre application :Below are some common tools to help you gather deep profiling information for your application:

Comment Profiler dans n’importe quel environnementHow to profile in any environment

Une façon de déterminer si votre application est liée au GPU ou à l’UC est de réduire la résolution de la sortie de la cible de rendu.One way to determine if your app is GPU or CPU bound is to lower the resolution of the render target output. En réduisant le nombre de pixels à calculer, vous réduisez la charge du GPU.By reducing the number of pixels to calculate, you'll reduce your GPU load. L’appareil est rendu sur une texture plus petite, puis sur un échantillon pour afficher votre image finale.The device will render to a smaller texture, then up-sample to display your final image.

Après avoir réduit la résolution de rendu, si :After lowering rendering resolution, if:

  1. L’application de fréquence d’images augmente, vous êtes probablement lié au GPUApplication framerate increases, then you're likely GPU Bound
  2. Fréquence d’application inchangée, vous êtes probablement lié à l' UCApplication framerate unchanged, then you're likely CPU Bound

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 via la propriété XRSettings. renderViewportScale .Unity provides the ability to easily modify the render target resolution of your application at runtime through the XRSettings.renderViewportScale property. La résolution de l’image finale présentée sur l’appareil est fixe.The final image presented on device has a fixed resolution. 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 affichages.The platform will sample the lower resolution output to build a higher resolution image for rendering on displays.

UnityEngine.XR.XRSettings.renderScale = 0.7f;

Comment améliorer votre applicationHow to improve your application

Recommandations sur les performances de processeurCPU performance recommendations

En règle générale, la plupart des travaux dans une application de réalité mixte sur l’UC impliquent la « simulation » de la scène et le traitement de votre logique d’application.Generally, most work in a mixed reality application on the CPU involves doing the "simulation" of the scene and processing your application logic. Les éléments suivants sont ciblés pour l’optimisation :The following areas are targeted for optimization:

  • AnimationsAnimations
  • PhysiquePhysics
  • Allocations de mémoireMemory allocations
  • Algorithmes complexes (c.-à-d.Complex algorithms (i.e cinématique inverse, recherche de chemin d’accès)inverse kinematics, path-finding)

Recommandations sur les performances de GPUGPU performance recommendations

Fonctionnement de la bande passante et du taux de remplissageUnderstanding bandwidth vs. fill rate

Lors du rendu d’une trame sur le GPU, une application est liée par une bande passante de mémoire ou un taux de remplissage.When rendering a frame on the GPU, an application is either bound by memory bandwidth or fill rate.

  • La bande passante de la mémoire est le taux de lectures et d’écritures que le GPU peut effectuer à partir de la mémoireMemory bandwidth is the rate of reads and writes the GPU can do from memory
    • Pour identifier les limitations de bande passante, réduisez la qualité de la texture et vérifiez si la fréquence d’images a été améliorée.To identify bandwidth limitations, reduce texture quality and check if the framerate has improved.
    • Dans Unity, modifiez la qualité de la texture dans modifier les paramètres du > projet > paramètres de qualité.In Unity, change Texture Quality in Edit > Project Settings > Quality Settings.
  • Le taux de remplissage fait référence aux pixels qui peuvent être dessinés par seconde par le GPU.Fill rate refers to the pixels that can be drawn per second by the GPU.
    • Pour identifier les limitations du taux de remplissage, réduisez la résolution de l’affichage et vérifiez si les images sont améliorées.To identify fill rate limitations, lower the display resolution and check if framerate improved.
    • Dans Unity, utilisez la propriété XRSettings. renderViewportScaleIn Unity, use the XRSettings.renderViewportScale property

La bande passante de la mémoire implique généralement des optimisations pour :Memory bandwidth generally involves optimizations to either:

  1. Résolutions de texture inférieuresLower texture resolutions
  2. Utilisez moins de textures (normales, spéculaire, etc.)Use fewer textures (normals, specular, and so on)

Le taux de remplissage est axé sur la réduction du nombre d’opérations qui doivent être calculées pour un pixel final rendu, notamment :Fill rate is focused on reducing the number of operations that need to be computed for a final rendered pixel, including:

  1. Nombre d’objets à restituer/traiterNumber of objects to render/process
  2. Nombre d’opérations par nuanceurNumber of operations per shader
  3. Nombre d’étapes du GPU vers le résultat final (nuanceurs Geometry, effets de la postérieure au traitement, etc.)Number of GPU stages to final result (geometry shaders, post-processing effects, and so on)
  4. Nombre de pixels à afficher (résolution d’affichage)Number of pixels to render (display resolution)

Réduire le nombre de polygonesReduce polygon count

Plus le nombre de polygones est élevé, plus il est important d’opérations pour le GPU, donc le fait de réduire le nombre de polygones dans votre scène réduit le temps de rendu.Higher polygon counts result in more operations for the GPU, so reducing the number of polygons in your scene reduces the render time. Il existe d’autres facteurs qui rendent l’ombrage de la géométrie cher, mais le nombre de polygones est la mesure la plus simple pour déterminer la quantité de travail nécessaire au rendu d’une scène.There are other factors that make shading the geometry expensive, but polygon count is the simplest metric to determine how much work it will take to render a scene.

Limiter le surdessinLimit overdraw

Un surdessin élevé se produit lorsque plusieurs objets sont rendus mais non affichés à l’écran, car ils sont masqués par un objet Boucher.High overdraw occurs when multiple objects are rendered but not shown on screen as they're hidden by an occluding object. Imaginez que vous examinez un mur qui contient des objets en arrière-plan.Imagine looking at a wall that has objects behind it. Toute la géométrie est traitée pour le rendu, mais seul le mur opaque doit être rendu, ce qui entraîne des opérations inutiles.All of the geometry would be processed for rendering, but only the opaque wall needs to be rendered, which results in unnecessary operations.

NuanceursShaders

Les nuanceurs sont des petits programmes qui s’exécutent sur le GPU et effectuent deux étapes importantes du rendu :Shaders are small programs that run on the GPU and do two important steps in rendering:

  1. Détermination des vertex à dessiner et de leur emplacement dans l’espace à l’écran (le nuanceur de sommets)Determining which vertices should be drawn and where they are in screen space (the Vertex shader)
    • Le nuanceur de sommets est exécuté par vertex pour chaque maille.The Vertex shader is executed per vertex for every mesh.
  2. Détermination de la couleur de chaque pixel (nuanceur de pixels)Determining the color of each pixel (the Pixel shader)
    • Le nuanceur de pixels est exécuté par pixel et est rendu par la géométrie à la texture de rendu cible.The Pixel shader is executed per pixel and rendered by the geometry to the target render texture.

En règle générale, les nuanceurs effectuent de nombreuses transformations et des calculs d’éclairage.Typically, shaders do many transformations and lighting calculations. Bien que les modèles d’éclairage complexes, les ombres et les autres opérations puissent générer des résultats fantastiques, ils sont également fournis avec un prix.Although complex lighting models, shadows, and other operations can generate fantastic results, they also come with a price. 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.Reducing the number of operations computed in shaders can greatly reduce the work needed for the GPU per frame.

Recommandations en matière de codage de nuanceurShader coding recommendations
  • Utiliser le filtrage bilinéaire, dans la mesure du possibleUse bilinear filtering, whenever possible
  • Réorganiser les expressions pour utiliser des intrinsèques MAD pour effectuer une multiplication et un ajout en même tempsRearrange expressions to use MAD intrinsics to do a multiply and an add at the same time
  • Précalculez autant que possible sur le processeur et transmettez-les en tant que constantes au matériel.Precalculate as much as possible on the CPU and pass as constants to the material
  • Privilégier les opérations de déplacement du nuanceur de pixels vers le nuanceur de sommetsFavor moving operations from the pixel shader to the vertex shader
    • En règle générale, le nombre de vertex est bien plus petit que le nombre de pixels (720p est de 921 600 pixels, 1080p correspond à 2 073 600 pixels, etc.)Generally, the number of vertices is much smaller than the number of pixels (720p is 921,600 pixels, 1080p is 2,073,600 pixels, and so on)

Supprimer les étapes du GPURemove GPU stages

Les effets postérieurs au traitement peuvent être coûteux et augmenter le taux de remplissage de votre application, y compris les techniques d’anticrénelage telles que MSAA.Post-processing effects can be expensive and increase the fill rate of your application, including anti-aliasing techniques like MSAA. Sur HoloLens, nous vous recommandons d’éviter ces techniques et d’autres étapes de nuanceur, telles que Geometry, la coque et les nuanceurs de calcul.On HoloLens, we recommended avoiding these techniques and additional shader stages such as geometry, hull, and compute shaders.

Recommandations sur la mémoireMemory recommendations

Les opérations d’allocation et de désallocation de mémoire excessives peuvent entraîner des performances incohérentes, des frames figés et d’autres comportements nuisibles.Excessive memory allocation and deallocation operations can result in inconsistent performance, frozen frames, and other detrimental behavior. 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 garbage collector.It's especially important to understand memory considerations when developing in Unity, since memory management is controlled by the garbage collector.

Mise en pool d’objetsObject pooling

Le mise en pool d’objets est une technique populaire pour réduire le coût des allocations et des désallocations continues d’objets.Object pooling is a popular technique to reduce the cost of continuous allocations and deallocations of objects. 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.This is done by allocating a large pool of identical objects and reusing inactive, available instances from this pool instead of constantly spawning and destroying objects over time. Les pools d’objets conviennent parfaitement aux composants réutilisables qui ont une durée de vie variable pendant une application.Object pools are great for reuseable components that have variable lifetime during an app.

Voir aussiSee also