Descripción del rendimiento de la realidad mixtaUnderstanding performance for mixed reality

Este artículo es una introducción a la comprensión del significado del rendimiento de la aplicación de realidad mixta.This article is an introduction to understanding the significance of performance for your Mixed Reality app. La experiencia del usuario se puede degradar considerablemente si la aplicación no se ejecuta con una velocidad de fotogramas óptima.User experience can be greatly degraded if your application doesn't run at optimal frame rate. Los hologramas aparecerán inestables y el seguimiento de los cabezales del entorno no será preciso, lo que conduce a una mala experiencia para el usuario.Holograms will appear unstable and head tracking of the environment will be inaccurate, leading to a poor experience for the user. El rendimiento se debe considerar como una característica de primera clase para el desarrollo de la realidad mixta y no para una tarea fina.Performance must be considered a first class feature for mixed reality development and not a polish task.

A continuación se enumeran los valores de velocidad de fotogramas de rendimiento para cada plataforma de destino.The performant framerate values for each target platform are listed below.

PlataformaPlatform Velocidad de fotogramas de destinoTarget Frame Rate
HoloLensHoloLens 60 FPS60 FPS
Windows Mixed Reality ultra PCWindows Mixed Reality Ultra PCs 90 FPS90 FPS
Equipos con Windows Mixed RealityWindows Mixed Reality PCs 60 FPS60 FPS

En el marco siguiente se describen los procedimientos recomendados para alcanzar las velocidades de fotogramas de destino.The framework below outlines best practices for hitting target frame rates. Se recomienda leer el artículo recomendaciones de rendimiento para Unity para obtener sugerencias sobre cómo medir y mejorar las velocidad de fotogramas en el entorno de Unity.We recommend reading the performance recommendations for Unity article for tips on measuring and improving framerate in the Unity environment.

Descripción de los cuellos de botella de rendimientoUnderstanding performance bottlenecks

Si la aplicación tiene una velocidad de fotogramas que realiza un uso intensivo, el primer paso consiste en analizar y comprender en qué medida su aplicación es intensiva.If your app has an underperforming framerate, the first step is to analyze and understand where your application is computationally intensive. Hay dos procesadores principales responsables del trabajo para representar la escena: la CPU y la GPU, cada una de las cuales controla distintos aspectos de la aplicación de realidad mixta.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. Los tres lugares principales en los que se pueden producir cuellos de botella son:The three key places where bottlenecks may occur are:

  1. Subproceso de aplicación: CPU - Responsable de la lógica de la aplicación, incluida la entrada de procesamiento, las animaciones, la física y otras lógicas de aplicación.App Thread - CPU - Responsible for your app logic, including processing input, animations, physics, and other app logic.
  2. Render Thread-CPU to GPU : responsable del envío de llamadas a Draw a la GPU.Render Thread - CPU to GPU - Responsible for submitting your draw calls to the GPU. Cuando la aplicación desea representar un objeto como un cubo o un modelo, este subproceso envía una solicitud a la GPU para realizar las operaciones.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 : normalmente controla la canalización de gráficos de la aplicación para transformar datos 3D (modelos, texturas, etc.) en píxeles.GPU - Most commonly handles the graphics pipeline of your application to transform 3D data (models, textures, and so on) into pixels. En última instancia, genera una imagen 2D para enviarla a la pantalla del dispositivo.It ultimately produces a 2D image to submit to your device's screen.

Duración de un marco

Por lo general, las aplicaciones de HoloLens estarán enlazadas por GPU, pero no siempre.Generally, HoloLens applications will be GPU bound, but not always. Use las herramientas y técnicas siguientes para entender dónde se encuentra un cuello de botella en la aplicación en particular.Use the tools and techniques below to understand where your particular app is bottlenecked.

Cómo analizar la aplicaciónHow to analyze your application

Hay muchas herramientas que le permiten comprender el perfil de rendimiento y los posibles cuellos de botella en la aplicación de realidad mixta.There are many tools that allow you to understand the performance profile and potential bottlenecks in your mixed reality application.

A continuación se muestran algunas herramientas comunes para ayudarle a recopilar información de generación de perfiles profunda para su aplicación:Below are some common tools to help you gather deep profiling information for your application:

Cómo generar perfiles en cualquier entornoHow to profile in any environment

Una manera de determinar si la aplicación es una GPU o un límite de CPU es reducir la resolución de la salida del destino de representación.One way to determine if your app is GPU or CPU bound is to lower the resolution of the render target output. Al reducir el número de píxeles que se van a calcular, reducirá la carga de la GPU.By reducing the number of pixels to calculate, you'll reduce your GPU load. El dispositivo se representará en una textura más pequeña y, luego, se mostrará como ejemplo para mostrar la imagen final.The device will render to a smaller texture, then up-sample to display your final image.

Después de reducir la resolución de representación, si:After lowering rendering resolution, if:

  1. La velocidad de fotogramas de aplicación aumenta, es probable que esté enlazada a GPUApplication framerate increases, then you're likely GPU Bound
  2. Velocidad de la aplicación inalterada, es probable que esté enlazada a la CPUApplication framerate unchanged, then you're likely CPU Bound

Nota

Unity proporciona la capacidad de modificar fácilmente la resolución del destino de representación de la aplicación en tiempo de ejecución a través de la propiedad XRSettings. renderViewportScale .Unity provides the ability to easily modify the render target resolution of your application at runtime through the XRSettings.renderViewportScale property. La imagen final presentada en el dispositivo tiene una resolución fija.The final image presented on device has a fixed resolution. La plataforma muestreará el resultado de la resolución inferior para crear una imagen de resolución más alta para la representación de las pantallas.The platform will sample the lower resolution output to build a higher resolution image for rendering on displays.

UnityEngine.XR.XRSettings.renderScale = 0.7f;

Cómo mejorar la aplicaciónHow to improve your application

Recomendaciones de rendimiento de CPUCPU performance recommendations

Por lo general, la mayor parte del trabajo en una aplicación de realidad mixta en la CPU implica la realización de la "simulación" de la escena y el procesamiento de la lógica de la aplicación.Generally, most work in a mixed reality application on the CPU involves doing the "simulation" of the scene and processing your application logic. Las siguientes áreas están destinadas a la optimización:The following areas are targeted for optimization:

  • AnimacionesAnimations
  • FísicaPhysics
  • Asignaciones de memoriaMemory allocations
  • Algoritmos complejos (es decir,Complex algorithms (i.e cinemática inversa, búsqueda de rutas de acceso)inverse kinematics, path-finding)

Recomendaciones de rendimiento de GPUGPU performance recommendations

Descripción del ancho de banda y la velocidad de rellenoUnderstanding bandwidth vs. fill rate

Al representar un fotograma en la GPU, una aplicación está enlazada por el ancho de banda de memoria o la velocidad de relleno.When rendering a frame on the GPU, an application is either bound by memory bandwidth or fill rate.

  • El ancho de banda de memoria es la velocidad de lecturas y escrituras que la GPU puede realizar desde la memoriaMemory bandwidth is the rate of reads and writes the GPU can do from memory
    • Para identificar las limitaciones de ancho de banda, reduzca la calidad de la textura y compruebe si la velocidad de fotogramas ha mejorado.To identify bandwidth limitations, reduce texture quality and check if the framerate has improved.
    • En Unity, cambie calidad de textura en Editar configuración de > proyecto > configuración de calidad.In Unity, change Texture Quality in Edit > Project Settings > Quality Settings.
  • La velocidad de relleno hace referencia a los píxeles que la GPU puede dibujar por segundo.Fill rate refers to the pixels that can be drawn per second by the GPU.
    • Para identificar las limitaciones de velocidad de relleno, reduzca la resolución de pantalla y compruebe si se ha mejorado la velocidad de fotogramas.To identify fill rate limitations, lower the display resolution and check if framerate improved.
    • En Unity, use la propiedad XRSettings. renderViewportScaleIn Unity, use the XRSettings.renderViewportScale property

Generalmente, el ancho de banda de memoria implica optimizaciones para:Memory bandwidth generally involves optimizations to either:

  1. Resoluciones de textura inferioresLower texture resolutions
  2. Usar menos texturas (normalización, reflejo, etc.)Use fewer textures (normals, specular, and so on)

La velocidad de relleno se centra en reducir el número de operaciones que se deben calcular para un píxel representado final, incluidos:Fill rate is focused on reducing the number of operations that need to be computed for a final rendered pixel, including:

  1. Número de objetos que se van a representar o procesarNumber of objects to render/process
  2. Número de operaciones por sombreadorNumber of operations per shader
  3. Número de fases de GPU en el resultado final (sombreadores de geometría, efectos de procesamiento posterior, etc.)Number of GPU stages to final result (geometry shaders, post-processing effects, and so on)
  4. Número de píxeles que se van a representar (resolución de pantalla)Number of pixels to render (display resolution)

Reducir el número de polígonosReduce polygon count

Los recuentos de polígonos más altos producen más operaciones para la GPU, por lo que reducir el número de polígonos de la escena reduce el tiempo de representación.Higher polygon counts result in more operations for the GPU, so reducing the number of polygons in your scene reduces the render time. Hay otros factores que hacen que el sombreado de la geometría sea caro, pero el recuento de polígonos es la métrica más simple para determinar la cantidad de trabajo que se tardará en representar una escena.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.

Sobredibujo del límiteLimit overdraw

El sobredibujo alto se produce cuando se representan varios objetos, pero no se muestran en la pantalla, ya que están ocultos por un objeto occluding.High overdraw occurs when multiple objects are rendered but not shown on screen as they're hidden by an occluding object. Imagine que mira una pared que tiene objetos detrás.Imagine looking at a wall that has objects behind it. Toda la geometría se procesaría para la representación, pero solo se debe representar la pared opaca, lo que produce operaciones innecesarias.All of the geometry would be processed for rendering, but only the opaque wall needs to be rendered, which results in unnecessary operations.

SombreadoresShaders

Los sombreadores son pequeños programas que se ejecutan en la GPU y realizan dos pasos importantes en la representación:Shaders are small programs that run on the GPU and do two important steps in rendering:

  1. Determinar qué vértices se deben dibujar y dónde se encuentran en el espacio de pantalla (el sombreador de vértices)Determining which vertices should be drawn and where they are in screen space (the Vertex shader)
    • El sombreador de vértices se ejecuta por vértice para cada malla.The Vertex shader is executed per vertex for every mesh.
  2. Determinar el color de cada píxel (el sombreador de píxeles)Determining the color of each pixel (the Pixel shader)
    • El sombreador de píxeles se ejecuta por píxel y lo representa la geometría en la textura de representación de destino.The Pixel shader is executed per pixel and rendered by the geometry to the target render texture.

Normalmente, los sombreadores realizan muchas transformaciones y cálculos de iluminación.Typically, shaders do many transformations and lighting calculations. Aunque los modelos de iluminación complejos, las sombras y otras operaciones pueden generar resultados fantásticos, también tienen un precio.Although complex lighting models, shadows, and other operations can generate fantastic results, they also come with a price. Reducir el número de operaciones calculadas en los sombreadores puede reducir en gran medida el trabajo necesario para la GPU por fotograma.Reducing the number of operations computed in shaders can greatly reduce the work needed for the GPU per frame.

Recomendaciones de codificación del sombreadorShader coding recommendations
  • Usar el filtrado bilineal, siempre que sea posibleUse bilinear filtering, whenever possible
  • Reorganizar expresiones para usar funciones intrínsecas de MAD para realizar una multiplicación y agregar al mismo tiempoRearrange expressions to use MAD intrinsics to do a multiply and an add at the same time
  • Calcular el precálculo tanto como sea posible en la CPU y pasar como constantes al materialPrecalculate as much as possible on the CPU and pass as constants to the material
  • Favorecer el movimiento de las operaciones desde el sombreador de píxeles hasta el sombreador de vérticesFavor moving operations from the pixel shader to the vertex shader
    • Por lo general, el número de vértices es mucho menor que el número de píxeles (720p es de 921.600 píxeles, 1080p es 2.073.600 píxeles, 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)

Quitar fases de GPURemove GPU stages

Los efectos posteriores al procesamiento pueden ser caros y aumentar la velocidad de relleno de la aplicación, incluidas las técnicas de suavizado de contorno como MSAA.Post-processing effects can be expensive and increase the fill rate of your application, including anti-aliasing techniques like MSAA. En HoloLens, se recomienda evitar estas técnicas y otras fases del sombreador, como la geometría, el casco y los sombreadores de cálculo.On HoloLens, we recommended avoiding these techniques and additional shader stages such as geometry, hull, and compute shaders.

Recomendaciones de memoriaMemory recommendations

Las operaciones de asignación y desasignación de memoria excesiva pueden dar lugar a un rendimiento incoherente, marcos inmovilizados y otro comportamiento perjudicial.Excessive memory allocation and deallocation operations can result in inconsistent performance, frozen frames, and other detrimental behavior. Es especialmente importante comprender las consideraciones de memoria al desarrollar en Unity, ya que la administración de la memoria se controla mediante el recolector de elementos no utilizados.It's especially important to understand memory considerations when developing in Unity, since memory management is controlled by the garbage collector.

Agrupación de objetosObject pooling

La agrupación de objetos es una técnica popular para reducir el costo de las asignaciones continuas y desasignaciones de objetos.Object pooling is a popular technique to reduce the cost of continuous allocations and deallocations of objects. Para ello, se asigna un grupo grande de objetos idénticos y se reutilizan instancias disponibles inactivas de este grupo en lugar de generar y destruir objetos constantemente a lo largo del tiempo.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. Los grupos de objetos son excelentes para los componentes reutilizables que tienen una duración variable en una aplicación.Object pools are great for reuseable components that have variable lifetime during an app.

Consulta tambiénSee also