Entendendo o desempenho da realidade misturadaUnderstanding performance for mixed reality

Este artigo é uma introdução ao entendimento do significado do desempenho para seu aplicativo de realidade misturada.This article is an introduction to understanding the significance of performance for your Mixed Reality app. A experiência do usuário pode ser bastante degradada se o seu aplicativo não for executado em uma taxa de quadros ideal.User experience can be greatly degraded if your application doesn't run at optimal frame rate. Os hologramas aparecerão instáveis e o controle de cabeça do ambiente será impreciso, levando a uma experiência ruim para o usuário.Holograms will appear unstable and head tracking of the environment will be inaccurate, leading to a poor experience for the user. O desempenho deve ser considerado um recurso de primeira classe para o desenvolvimento de realidade misturada e não uma tarefa em polonês.Performance must be considered a first class feature for mixed reality development and not a polish task.

Os valores de taxa de quadros de alto desempenho para cada plataforma de destino são listados abaixo.The performant framerate values for each target platform are listed below.

PlataformaPlatform Taxa de quadros de destinoTarget Frame Rate
HoloLensHoloLens 60 FPS60 FPS
Windows Mixed Reality ultra PCsWindows Mixed Reality Ultra PCs 90 FPS90 FPS
Computadores Windows Mixed RealityWindows Mixed Reality PCs 60 FPS60 FPS

A estrutura a seguir descreve as práticas recomendadas para atingir as taxas de quadros de destino.The framework below outlines best practices for hitting target frame rates. É recomendável ler o artigo recomendações de desempenho para o Unity para obter dicas sobre como medir e melhorar a taxa de quadros no ambiente do Unity.We recommend reading the performance recommendations for Unity article for tips on measuring and improving framerate in the Unity environment.

Noções básicas sobre afunilamentos de desempenhoUnderstanding performance bottlenecks

Se seu aplicativo tiver uma taxa de quadros com desempenho alto, a primeira etapa será analisar e entender onde o aplicativo é computacionalmente intensivo.If your app has an underperforming framerate, the first step is to analyze and understand where your application is computationally intensive. Há dois processadores principais responsáveis pelo trabalho de renderizar sua cena: a CPU e a GPU, cada um manipulando diferentes aspectos do seu aplicativo de realidade misturada.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. Os três locais principais onde os afunilamentos podem ocorrer são:The three key places where bottlenecks may occur are:

  1. Thread de aplicativo-CPU - Responsável pela lógica do aplicativo, incluindo entrada de processamento, animações, física e outras lógicas de aplicativo.App Thread - CPU - Responsible for your app logic, including processing input, animations, physics, and other app logic.
  2. Renderizar thread-CPU para GPU -responsável por enviar suas chamadas de desenho para a GPU.Render Thread - CPU to GPU - Responsible for submitting your draw calls to the GPU. Quando seu aplicativo deseja renderizar um objeto como um cubo ou modelo, esse thread envia uma solicitação para a GPU para realizar as operações.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. A GPU -normalmente manipula a pipeline gráfica de seu aplicativo para transformar dados 3D (modelos, texturas etc.) em pixels.GPU - Most commonly handles the graphics pipeline of your application to transform 3D data (models, textures, and so on) into pixels. Ele finalmente produz uma imagem 2D para enviar à tela do seu dispositivo.It ultimately produces a 2D image to submit to your device's screen.

Tempo de vida de um quadro

Geralmente, os aplicativos do HoloLens serão associados à GPU, mas nem sempre.Generally, HoloLens applications will be GPU bound, but not always. Use as ferramentas e técnicas abaixo para entender onde seu aplicativo específico está afunilado.Use the tools and techniques below to understand where your particular app is bottlenecked.

Como analisar seu aplicativoHow to analyze your application

Há muitas ferramentas que permitem que você entenda o perfil de desempenho e gargalos potenciais em seu aplicativo de realidade misturada.There are many tools that allow you to understand the performance profile and potential bottlenecks in your mixed reality application.

Abaixo estão algumas ferramentas comuns para ajudá-lo a coletar informações de criação de perfil aprofundadas para seu aplicativo:Below are some common tools to help you gather deep profiling information for your application:

Como criar um perfil em qualquer ambienteHow to profile in any environment

Uma maneira de determinar se seu aplicativo está associado à GPU ou à CPU é reduzir a resolução da saída de destino de renderização.One way to determine if your app is GPU or CPU bound is to lower the resolution of the render target output. Ao reduzir o número de pixels para calcular, você reduzirá sua carga de GPU.By reducing the number of pixels to calculate, you'll reduce your GPU load. O dispositivo será renderizado para uma textura menor e, em seguida, a amostra para exibir a imagem final.The device will render to a smaller texture, then up-sample to display your final image.

Depois de reduzir a resolução de renderização, se:After lowering rendering resolution, if:

  1. Aumento da taxa de quadros do aplicativo; provavelmente, você está vinculado à GPUApplication framerate increases, then you're likely GPU Bound
  2. Taxa de quadros do aplicativo inalterado, provavelmente, você está com a CPU associadaApplication framerate unchanged, then you're likely CPU Bound

Observação

O Unity fornece a capacidade de modificar facilmente a resolução de destino de renderização de seu aplicativo em tempo de execução por meio da propriedade XRSettings. renderViewportScale .Unity provides the ability to easily modify the render target resolution of your application at runtime through the XRSettings.renderViewportScale property. A imagem final apresentada no dispositivo tem uma resolução fixa.The final image presented on device has a fixed resolution. A plataforma obterá uma amostra da saída de resolução mais baixa para criar uma imagem de resolução mais alta para renderização em exibições.The platform will sample the lower resolution output to build a higher resolution image for rendering on displays.

UnityEngine.XR.XRSettings.renderScale = 0.7f;

Como melhorar seu aplicativoHow to improve your application

Recomendações de desempenho da CPUCPU performance recommendations

Em geral, a maior parte do trabalho em um aplicativo de realidade misturada na CPU envolve a "simulação" da cena e o processamento da lógica do aplicativo.Generally, most work in a mixed reality application on the CPU involves doing the "simulation" of the scene and processing your application logic. As seguintes áreas são destinadas à otimização:The following areas are targeted for optimization:

  • AnimaçõesAnimations
  • FísicaPhysics
  • Alocações de memóriaMemory allocations
  • Algoritmos complexos (ou seja,Complex algorithms (i.e cinemática inversa, localização de caminho)inverse kinematics, path-finding)

Recomendações de desempenho da GPUGPU performance recommendations

Compreendendo a largura de banda versus a taxa de preenchimentoUnderstanding bandwidth vs. fill rate

Ao renderizar um quadro na GPU, um aplicativo é associado pela largura de banda da memória ou pela taxa de preenchimento.When rendering a frame on the GPU, an application is either bound by memory bandwidth or fill rate.

  • Largura de banda de memória é a taxa de leituras e gravações que a GPU pode fazer da memóriaMemory bandwidth is the rate of reads and writes the GPU can do from memory
    • Para identificar as limitações de largura de banda, reduza a qualidade da textura e verifique se a taxa de quadros foi aprimorada.To identify bandwidth limitations, reduce texture quality and check if the framerate has improved.
    • No Unity, altere a qualidade da textura em Editar > configurações do projeto > configurações de qualidade.In Unity, change Texture Quality in Edit > Project Settings > Quality Settings.
  • A taxa de preenchimento refere-se aos pixels que podem ser desenhados por segundo pela GPU.Fill rate refers to the pixels that can be drawn per second by the GPU.
    • Para identificar as limitações da taxa de preenchimento, reduza a resolução de vídeo e verifique se a taxa de quadros foi aprimorada.To identify fill rate limitations, lower the display resolution and check if framerate improved.
    • No Unity, use a propriedade XRSettings. renderViewportScaleIn Unity, use the XRSettings.renderViewportScale property

A largura de banda de memória geralmente envolve otimizações para:Memory bandwidth generally involves optimizations to either:

  1. Resoluções de textura inferioresLower texture resolutions
  2. Usar menos texturas (normais, especulares e assim por diante)Use fewer textures (normals, specular, and so on)

A taxa de preenchimento concentra-se na redução do número de operações que precisam ser computadas para um pixel renderizado final, incluindo: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 a serem renderizados/processadosNumber of objects to render/process
  2. Número de operações por sombreadorNumber of operations per shader
  3. Número de estágios de GPU para o resultado final (sombreadores de geometria, efeitos pós-processamento e assim por diante)Number of GPU stages to final result (geometry shaders, post-processing effects, and so on)
  4. Número de pixels a serem renderizados (resolução de vídeo)Number of pixels to render (display resolution)

Reduzir contagem de polígonosReduce polygon count

Contagens de polígono mais altas resultam em mais operações para a GPU, portanto, reduzir o número de polígonos em sua cena reduz o tempo de renderização.Higher polygon counts result in more operations for the GPU, so reducing the number of polygons in your scene reduces the render time. Há outros fatores que tornam o sombreamento caro da geometria, mas a contagem de polígonos é a métrica mais simples para determinar quanto trabalho será necessário para processar uma cena.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.

Limitar a sobreposiçãoLimit overdraw

O alto sobreempate ocorre quando vários objetos são renderizados, mas não são mostrados na tela, pois estão ocultos por um objeto occluding.High overdraw occurs when multiple objects are rendered but not shown on screen as they're hidden by an occluding object. Imagine examinar uma parede que contém objetos por trás dela.Imagine looking at a wall that has objects behind it. Toda a geometria seria processada para renderização, mas apenas a parede opaca precisa ser renderizada, o que resulta em operações desnecessárias.All of the geometry would be processed for rendering, but only the opaque wall needs to be rendered, which results in unnecessary operations.

SombreadoresShaders

Os sombreadores são programas pequenos que são executados na GPU e executam duas etapas importantes na renderização:Shaders are small programs that run on the GPU and do two important steps in rendering:

  1. Determinando quais vértices devem ser desenhados e onde estão no espaço da tela (o sombreador de vértice)Determining which vertices should be drawn and where they are in screen space (the Vertex shader)
    • O sombreador de vértice é executado por vértice para cada malha.The Vertex shader is executed per vertex for every mesh.
  2. Determinando a cor de cada pixel (o sombreador de pixel)Determining the color of each pixel (the Pixel shader)
    • O sombreador de pixel é executado por pixel e renderizado pela geometria para a textura de renderização de destino.The Pixel shader is executed per pixel and rendered by the geometry to the target render texture.

Normalmente, os sombreadores fazem muitas transformações e cálculos de iluminação.Typically, shaders do many transformations and lighting calculations. Embora modelos de iluminação complexos, sombras e outras operações possam gerar resultados fantásticos, eles também têm um preço.Although complex lighting models, shadows, and other operations can generate fantastic results, they also come with a price. Reduzir o número de operações computadas em sombreadores pode reduzir muito o trabalho necessário para a GPU por quadro.Reducing the number of operations computed in shaders can greatly reduce the work needed for the GPU per frame.

Recomendações de codificação de sombreadorShader coding recommendations
  • Use a filtragem biline, sempre que possívelUse bilinear filtering, whenever possible
  • Reorganize as expressões para usar os intrínsecos do MAD para fazer uma multiplicação e uma adição ao mesmo tempoRearrange expressions to use MAD intrinsics to do a multiply and an add at the same time
  • Precalcule o máximo possível na CPU e passe como constantes para o materialPrecalculate as much as possible on the CPU and pass as constants to the material
  • Favorecer operações de movimentação do sombreador de pixel para o sombreador de vérticeFavor moving operations from the pixel shader to the vertex shader
    • Em geral, o número de vértices é muito menor do que o número de pixels (720p é de 921.600 pixels, 1080p é de 2.073.600 pixels e assim por diante)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)

Remover estágios de GPURemove GPU stages

Os efeitos de pós-processamento podem ser caros e aumentar a taxa de preenchimento do seu aplicativo, incluindo técnicas de suavização de alias, como a MSAA.Post-processing effects can be expensive and increase the fill rate of your application, including anti-aliasing techniques like MSAA. No HoloLens, recomendamos evitar essas técnicas e outros estágios de sombreador, como Geometry, envoltória e sombreadores de computação.On HoloLens, we recommended avoiding these techniques and additional shader stages such as geometry, hull, and compute shaders.

Recomendações de memóriaMemory recommendations

As operações de alocação e desalocação de memória excessivas podem resultar em desempenho inconsistente, quadros congelados e outros comportamentos prejudiciais.Excessive memory allocation and deallocation operations can result in inconsistent performance, frozen frames, and other detrimental behavior. É especialmente importante entender as considerações de memória ao desenvolver no Unity, pois o gerenciamento de memória é controlado pelo coletor de lixo.It's especially important to understand memory considerations when developing in Unity, since memory management is controlled by the garbage collector.

Pool de objetosObject pooling

O pool de objetos é uma técnica popular para reduzir o custo de alocações e desalocações contínuas de objetos.Object pooling is a popular technique to reduce the cost of continuous allocations and deallocations of objects. Isso é feito pela alocação de um grande pool de objetos idênticos e pela reutilização das instâncias disponíveis inativas desse pool em vez da criação e da destruição constantes de objetos ao longo do 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. Os pools de objetos são ótimos para componentes reutilizados que têm um tempo de vida variável durante um aplicativo.Object pools are great for reuseable components that have variable lifetime during an app.

Veja tambémSee also