Informazioni sulle prestazioni per la realtà mistaUnderstanding performance for mixed reality

Questo articolo è un'introduzione alla comprensione del significato delle prestazioni per l'app per realtà mista.This article is an introduction to understanding the significance of performance for your Mixed Reality app. L'esperienza utente può essere notevolmente degradata se l'applicazione non viene eseguita con una frequenza di fotogrammi ottimale.User experience can be greatly degraded if your application doesn't run at optimal frame rate. Gli ologrammi appariranno instabile e il rilevamento delle intestazioni dell'ambiente non sarà accurato, causando una scarsa esperienza per l'utente.Holograms will appear unstable and head tracking of the environment will be inaccurate, leading to a poor experience for the user. Le prestazioni devono essere considerate una funzionalità di prima classe per lo sviluppo di realtà mista e non per le attività polacche.Performance must be considered a first class feature for mixed reality development and not a polish task.

Di seguito sono elencati i valori di framerate a prestazioni per ogni piattaforma di destinazione.The performant framerate values for each target platform are listed below.

PiattaformaPlatform Frequenza fotogrammi di destinazioneTarget Frame Rate
HoloLensHoloLens 60 FPS60 FPS
Windows reality Ultra PCWindows Mixed Reality Ultra PCs 90 FPS90 FPS
PC con realtà mista di WindowsWindows Mixed Reality PCs 60 FPS60 FPS

Il Framework seguente descrive le procedure consigliate per raggiungere le frequenze dei fotogrammi di destinazione.The framework below outlines best practices for hitting target frame rates. Si consiglia di leggere l' articolo raccomandazioni per le prestazioni per Unity per suggerimenti sulla misurazione e sul miglioramento della framerate nell'ambiente Unity.We recommend reading the performance recommendations for Unity article for tips on measuring and improving framerate in the Unity environment.

Informazioni sui colli di bottiglia delle prestazioniUnderstanding performance bottlenecks

Se l'app ha un framerate sottoposto a sottoesecuzione, il primo passaggio consiste nell'analizzare e comprendere il modo in cui l'applicazione è a elevato utilizzo di calcolo.If your app has an underperforming framerate, the first step is to analyze and understand where your application is computationally intensive. Ci sono due processori primari responsabili del lavoro per il rendering della scena: la CPU e la GPU, ognuno dei quali gestisce diversi aspetti dell'app per realtà mista.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. I tre punti chiave in cui possono verificarsi i colli di bottiglia sono:The three key places where bottlenecks may occur are:

  1. Thread app-CPU - Responsabile della logica dell'app, tra cui l'elaborazione di input, animazioni, fisica e altre logiche dell'app.App Thread - CPU - Responsible for your app logic, including processing input, animations, physics, and other app logic.
  2. Consente di eseguire il rendering della CPU dalla CPU alla GPU , responsabile dell'invio delle chiamate di disegnare alla GPU.Render Thread - CPU to GPU - Responsible for submitting your draw calls to the GPU. Quando l'app vuole eseguire il rendering di un oggetto, ad esempio un cubo o un modello, questo thread invia una richiesta alla GPU per eseguire le operazioni.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. GPU : in genere gestisce la pipeline grafica dell'applicazione per trasformare i dati 3D (modelli, trame e così via) in pixel.GPU - Most commonly handles the graphics pipeline of your application to transform 3D data (models, textures, and so on) into pixels. Produce infine un'immagine 2D da inviare alla schermata del dispositivo.It ultimately produces a 2D image to submit to your device's screen.

Durata di un frame

In genere, le applicazioni HoloLens saranno vincolate alla GPU, ma non sempre.Generally, HoloLens applications will be GPU bound, but not always. Usare gli strumenti e le tecniche seguenti per capire dove si trova un collo di bottiglia per l'app specifica.Use the tools and techniques below to understand where your particular app is bottlenecked.

Come analizzare l'applicazioneHow to analyze your application

Sono disponibili molti strumenti che consentono di comprendere il profilo delle prestazioni e i potenziali colli di bottiglia nell'applicazione di realtà mista.There are many tools that allow you to understand the performance profile and potential bottlenecks in your mixed reality application.

Di seguito sono riportati alcuni strumenti comuni che consentono di raccogliere informazioni di profilatura approfondite per l'applicazione:Below are some common tools to help you gather deep profiling information for your application:

Come profilare in qualsiasi ambienteHow to profile in any environment

Un modo per determinare se l'app è associata alla GPU o alla CPU è abbassare la risoluzione dell'output della destinazione di rendering.One way to determine if your app is GPU or CPU bound is to lower the resolution of the render target output. Riducendo il numero di pixel da calcolare, il carico della GPU verrà ridotto.By reducing the number of pixels to calculate, you'll reduce your GPU load. Il rendering del dispositivo verrà eseguito su una trama più piccola, quindi su-Sample per visualizzare l'immagine finale.The device will render to a smaller texture, then up-sample to display your final image.

Dopo la riduzione della risoluzione del rendering, se:After lowering rendering resolution, if:

  1. Il framerate dell'applicazione aumenta, quindi è probabile che il limite della GPU siaApplication framerate increases, then you're likely GPU Bound
  2. Framerate dell'applicazione invariato, probabilmente il limite della CPUApplication framerate unchanged, then you're likely CPU Bound

Nota

Unity offre la possibilità di modificare facilmente la risoluzione della destinazione di rendering dell'applicazione in fase di esecuzione tramite la proprietà XRSettings. renderViewportScale .Unity provides the ability to easily modify the render target resolution of your application at runtime through the XRSettings.renderViewportScale property. La risoluzione dell'immagine finale visualizzata sul dispositivo è fissa.The final image presented on device has a fixed resolution. La piattaforma campiona l'output di risoluzione inferiore per creare un'immagine di risoluzione superiore per il rendering delle visualizzazioni.The platform will sample the lower resolution output to build a higher resolution image for rendering on displays.

UnityEngine.XR.XRSettings.renderScale = 0.7f;

Come migliorare l'applicazioneHow to improve your application

Consigli sulle prestazioni della CPUCPU performance recommendations

In genere, la maggior parte del lavoro in un'applicazione di realtà mista sulla CPU comporta la simulazione della scena e l'elaborazione della logica dell'applicazione.Generally, most work in a mixed reality application on the CPU involves doing the "simulation" of the scene and processing your application logic. Le aree seguenti sono destinate all'ottimizzazione:The following areas are targeted for optimization:

  • AnimazioniAnimations
  • FisicaPhysics
  • Allocazioni di memoriaMemory allocations
  • Algoritmi complessi, ad esempioComplex algorithms (i.e cinematica inversa, ricerca di percorsiinverse kinematics, path-finding)

Consigli sulle prestazioni della GPUGPU performance recommendations

Informazioni sulla larghezza di banda e sulla velocità di riempimentoUnderstanding bandwidth vs. fill rate

Quando si esegue il rendering di un frame sulla GPU, un'applicazione è associata a una larghezza di banda o a una velocità di riempimento della memoria.When rendering a frame on the GPU, an application is either bound by memory bandwidth or fill rate.

  • La larghezza di banda della memoria è la frequenza di letture e scritture che la GPU può eseguire dalla memoriaMemory bandwidth is the rate of reads and writes the GPU can do from memory
    • Per identificare le limitazioni della larghezza di banda, ridurre la qualità della trama e verificare se il framerate è migliorato.To identify bandwidth limitations, reduce texture quality and check if the framerate has improved.
    • In Unity modificare la qualità della trama nelle impostazioni di qualità modifica > Impostazioni progetto > .In Unity, change Texture Quality in Edit > Project Settings > Quality Settings.
  • La velocità di riempimento si riferisce ai pixel che possono essere disegnati al secondo dalla GPU.Fill rate refers to the pixels that can be drawn per second by the GPU.
    • Per identificare le limitazioni della velocità di riempimento, abbassare la risoluzione dello schermo e verificare se il framerate è migliorato.To identify fill rate limitations, lower the display resolution and check if framerate improved.
    • In Unity, usare la proprietà XRSettings. renderViewportScaleIn Unity, use the XRSettings.renderViewportScale property

La larghezza di banda della memoria comporta in genere ottimizzazioni per:Memory bandwidth generally involves optimizations to either:

  1. Risoluzioni di trama inferioriLower texture resolutions
  2. Usare meno trame (normali, speculari e così via)Use fewer textures (normals, specular, and so on)

La velocità di riempimento si concentra sulla riduzione del numero di operazioni che devono essere calcolate per un pixel finale sottoposto a rendering, tra cui:Fill rate is focused on reducing the number of operations that need to be computed for a final rendered pixel, including:

  1. Numero di oggetti di cui eseguire il rendering o il processoNumber of objects to render/process
  2. Numero di operazioni per shaderNumber of operations per shader
  3. Numero di fasi GPU fino al risultato finale (Geometry shader, effetti post-elaborazione e così via)Number of GPU stages to final result (geometry shaders, post-processing effects, and so on)
  4. Numero di pixel di cui eseguire il rendering (risoluzione dello schermo)Number of pixels to render (display resolution)

Ridurre il numero di poligoniReduce polygon count

Il numero di poligoni più elevati comporta un numero maggiore di operazioni per la GPU, quindi la riduzione del numero di poligoni nella scena riduce il tempo di rendering.Higher polygon counts result in more operations for the GPU, so reducing the number of polygons in your scene reduces the render time. Esistono altri fattori che rendono l'ombreggiatura costosa, ma il conteggio dei poligoni è la metrica più semplice per determinare la quantità di lavoro necessaria per il rendering di una scena.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.

Limitare le sovrapposizioniLimit overdraw

Un elevato livello di sovradisegnazione si verifica quando viene eseguito il rendering di più oggetti ma non vengono visualizzati sullo schermo quando sono nascosti da un oggetto occlusione.High overdraw occurs when multiple objects are rendered but not shown on screen as they're hidden by an occluding object. Si supponga di esaminare un muro con oggetti sottostanti.Imagine looking at a wall that has objects behind it. Tutte le geometrie verranno elaborate per il rendering, ma è necessario eseguire il rendering solo della parete opaca, che comporta operazioni superflue.All of the geometry would be processed for rendering, but only the opaque wall needs to be rendered, which results in unnecessary operations.

ShaderShaders

Gli shader sono piccoli programmi eseguiti sulla GPU ed eseguono due passaggi importanti per il rendering:Shaders are small programs that run on the GPU and do two important steps in rendering:

  1. Determinazione dei vertici da disegnare e della posizione in cui si trovano nello spazio dello schermo (Vertex shader)Determining which vertices should be drawn and where they are in screen space (the Vertex shader)
    • Il vertex shader viene eseguito per ogni vertice per ogni mesh.The Vertex shader is executed per vertex for every mesh.
  2. Determinazione del colore di ogni pixel (pixel shader)Determining the color of each pixel (the Pixel shader)
    • Il pixel shader viene eseguito per pixel e sottoposto a rendering dalla geometria alla trama di rendering di destinazione.The Pixel shader is executed per pixel and rendered by the geometry to the target render texture.

In genere, gli shader eseguono numerose trasformazioni e calcoli di illuminazione.Typically, shaders do many transformations and lighting calculations. Sebbene i modelli di illuminazione complessi, le ombre e altre operazioni possano generare risultati eccezionali, presentano anche un prezzo.Although complex lighting models, shadows, and other operations can generate fantastic results, they also come with a price. La riduzione del numero di operazioni calcolate negli shader può ridurre notevolmente il lavoro necessario per la GPU per fotogramma.Reducing the number of operations computed in shaders can greatly reduce the work needed for the GPU per frame.

Suggerimenti sulla codifica dello shaderShader coding recommendations
  • Usare il filtro bilineare, laddove possibileUse bilinear filtering, whenever possible
  • Ridisporre le espressioni in modo da usare funzioni intrinseche folli per eseguire un'operazione Multiply e aggiungere contemporaneamenteRearrange expressions to use MAD intrinsics to do a multiply and an add at the same time
  • Precalcolare quanto più possibile sulla CPU e passare come costanti al materialePrecalculate as much as possible on the CPU and pass as constants to the material
  • Preferire le operazioni di trasferimento dal pixel shader al vertex shaderFavor moving operations from the pixel shader to the vertex shader
    • In genere, il numero di vertici è molto più piccolo del numero di pixel (720p è 921.600 pixel, 1080p è 2.073.600 pixel e così via)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)

Rimuovi fasi GPURemove GPU stages

Gli effetti di post-elaborazione possono essere costosi e aumentare la velocità di riempimento dell'applicazione, incluse le tecniche di anti-aliasing come MSAA.Post-processing effects can be expensive and increase the fill rate of your application, including anti-aliasing techniques like MSAA. In HoloLens è consigliabile evitare queste tecniche e altre fasi dello shader, ad esempio geometria, scafo e compute shader.On HoloLens, we recommended avoiding these techniques and additional shader stages such as geometry, hull, and compute shaders.

Consigli sulla memoriaMemory recommendations

Un numero eccessivo di operazioni di allocazione e deallocazione della memoria può comportare prestazioni incoerenti, frame bloccati e altro comportamento dannoso.Excessive memory allocation and deallocation operations can result in inconsistent performance, frozen frames, and other detrimental behavior. È particolarmente importante comprendere le considerazioni sulla memoria durante lo sviluppo in Unity, perché la gestione della memoria è controllata dal Garbage Collector.It's especially important to understand memory considerations when developing in Unity, since memory management is controlled by the garbage collector.

Pooling di oggettiObject pooling

Il pool di oggetti è una tecnica comune per ridurre i costi delle allocazioni e delle deallocazioni continue degli oggetti.Object pooling is a popular technique to reduce the cost of continuous allocations and deallocations of objects. Viene eseguito allocando un pool di grandi dimensioni di oggetti identici e riutilizzando le istanze inattive disponibili di questo pool invece di generare ed eliminare costantemente gli oggetti nel tempo.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. I pool di oggetti sono la soluzione ideale per i componenti riutilizzabili con durata variabile durante l'esecuzione di un'app.Object pools are great for reuseable components that have variable lifetime during an app.

Vedi ancheSee also