Основные сведения о производительности смешанной реальностиUnderstanding performance for mixed reality

В этой статье приводятся общие сведения о значимости производительности для приложения смешанной реальности.This article is an introduction to understanding the significance of performance for your Mixed Reality app. Работа пользователей может быть значительно снижена, если приложение не работает с оптимальной частотой кадров.User experience can be greatly degraded if your application doesn't run at optimal frame rate. Голограммы будут отображаться нестабильно, а отслеживание головного окружения будет неточным, что приведет к ухудшению работы пользователя.Holograms will appear unstable and head tracking of the environment will be inaccurate, leading to a poor experience for the user. Производительность должна рассматриваться как первая функция класса для разработки смешанной реальности, а не для польской задачи.Performance must be considered a first class feature for mixed reality development and not a polish task.

Ниже перечислены значения для выполнения частоты кадров для каждой целевой платформы.The performant framerate values for each target platform are listed below.

ПлатформаPlatform Частота целевых кадровTarget Frame Rate
HoloLensHoloLens 60 кадров/с60 FPS
Портативные компьютеры Windows Mixed RealityWindows Mixed Reality Ultra PCs 90 КАДРОВ/С90 FPS
Компьютеры Windows Mixed RealityWindows Mixed Reality PCs 60 кадров/с60 FPS

В приведенной ниже структуре представлены рекомендации по использованию ставок целевых кадров.The framework below outlines best practices for hitting target frame rates. Мы рекомендуем ознакомиться со статьей рекомендации по производительности для Unity , чтобы получить советы по измерению и улучшению частоты кадров в среде Unity.We recommend reading the performance recommendations for Unity article for tips on measuring and improving framerate in the Unity environment.

Основные сведения о узких местах производительностиUnderstanding performance bottlenecks

Если приложение имеет небольшую частоту кадров, первый шаг состоит в анализе и понимании того, где приложение получает ресурсоемкие вычисления.If your app has an underperforming framerate, the first step is to analyze and understand where your application is computationally intensive. Существует два основных процессора, ответственных за работу с визуализацией сцены: ЦП и GPU, каждый из которых обрабатывает различные аспекты приложения смешанной реальности.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. Ниже приведены три ключевых места, где могут возникнуть узкие места:The three key places where bottlenecks may occur are:

  1. Поток приложения — ЦП - Отвечает за логику приложения, включая обработку входных данных, анимацию, физику и другую логику приложения.App Thread - CPU - Responsible for your app logic, including processing input, animations, physics, and other app logic.
  2. Прорисовка потока — ЦП в GPU — отвечает за отправку вызовов рисования в GPU.Render Thread - CPU to GPU - Responsible for submitting your draw calls to the GPU. Когда приложение хочет отобразить объект, например куб или модель, этот поток отправляет в графический процессор запрос на выполнение операций.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 — чаще всего обрабатывает графический конвейер приложения для преобразования трехмерных данных (моделей, текстур и т. д.) в пиксели.GPU - Most commonly handles the graphics pipeline of your application to transform 3D data (models, textures, and so on) into pixels. В итоге он создает 2D-образ для отправки на экран устройства.It ultimately produces a 2D image to submit to your device's screen.

Время существования кадра

Как правило, приложения HoloLens будут привязаны к GPU, но не всегда.Generally, HoloLens applications will be GPU bound, but not always. Используйте приведенные ниже средства и методики, чтобы понять, где размещается узкие места в конкретном приложении.Use the tools and techniques below to understand where your particular app is bottlenecked.

Анализ приложенияHow to analyze your application

Существует множество средств, позволяющих понять профиль производительности и потенциальные узкие места в приложении смешанной реальности.There are many tools that allow you to understand the performance profile and potential bottlenecks in your mixed reality application.

Ниже приведены некоторые распространенные средства, помогающие собрать подробные сведения о профилировании для приложения.Below are some common tools to help you gather deep profiling information for your application:

Профилирование в любой средеHow to profile in any environment

Один из способов определить, является ли приложение процессором GPU или ЦП, — снизить разрешение выходных данных целевого объекта отрисовки.One way to determine if your app is GPU or CPU bound is to lower the resolution of the render target output. Уменьшая количество пикселей для вычисления, вы сокращаете нагрузку на GPU.By reducing the number of pixels to calculate, you'll reduce your GPU load. Устройство будет отображаться в текстуре меньшего размера, а затем — в виде образца, чтобы отобразить окончательный образ.The device will render to a smaller texture, then up-sample to display your final image.

При понижении разрешения отрисовки, если:After lowering rendering resolution, if:

  1. Частота приложений увеличивается, и вы, скорее всего, привязаны к GPUApplication framerate increases, then you're likely GPU Bound
  2. Частота кадров приложения не изменилась, скорее всего, с границей ЦПApplication framerate unchanged, then you're likely CPU Bound

Примечание

Unity предоставляет возможность легко изменять разрешение целевого объекта отрисовки приложения во время выполнения с помощью свойства ксрсеттингс. рендервиевпортскале .Unity provides the ability to easily modify the render target resolution of your application at runtime through the XRSettings.renderViewportScale property. Конечный образ, представленный на устройстве, имеет фиксированное разрешение.The final image presented on device has a fixed resolution. Платформа будет выполнять выборку выходных данных с низким разрешением для создания изображения более высокого разрешения для отображения на экране.The platform will sample the lower resolution output to build a higher resolution image for rendering on displays.

UnityEngine.XR.XRSettings.renderScale = 0.7f;

Как улучшить приложениеHow to improve your application

Рекомендации по производительности ЦПCPU performance recommendations

Как правило, большинство работы в приложении смешанной реальности на ЦП предполагает выполнение "моделирования" сцены и обработку логики приложения.Generally, most work in a mixed reality application on the CPU involves doing the "simulation" of the scene and processing your application logic. Следующие области предназначены для оптимизации:The following areas are targeted for optimization:

  • АнимацииAnimations
  • ФизикаPhysics
  • Выделение памятиMemory allocations
  • Сложные алгоритмы (т. е.Complex algorithms (i.e Обратная кинематика, поиск по пути)inverse kinematics, path-finding)

Рекомендации по производительности GPUGPU performance recommendations

Общие сведения о пропускной способности и скорости заполненияUnderstanding bandwidth vs. fill rate

При отрисовке кадра на GPU приложение либо ограничивается пропускной способностью памяти, либо скоростью заполнения.When rendering a frame on the GPU, an application is either bound by memory bandwidth or fill rate.

  • Пропускная способность памяти — это частота операций чтения и записи, которую GPU может выполнять из памяти.Memory bandwidth is the rate of reads and writes the GPU can do from memory
    • Чтобы определить ограничения пропускной способности, уменьшите качество текстуры и проверьте, увеличилась ли частота кадров.To identify bandwidth limitations, reduce texture quality and check if the framerate has improved.
    • В Unity измените качество текстуры в окне изменение параметров > проекта параметры > качества.In Unity, change Texture Quality in Edit > Project Settings > Quality Settings.
  • Коэффициент заполнения относится к пикселям, которые могут быть выведены в секунду графическим процессором.Fill rate refers to the pixels that can be drawn per second by the GPU.
    • Чтобы определить ограничения скорости заполнения, уменьшите разрешение экрана и проверьте, увеличилась ли частота кадров.To identify fill rate limitations, lower the display resolution and check if framerate improved.
    • В Unity используйте свойство ксрсеттингс. рендервиевпортскале.In Unity, use the XRSettings.renderViewportScale property

Пропускная способность памяти обычно включает оптимизацию для одного из следующих вариантов:Memory bandwidth generally involves optimizations to either:

  1. Уменьшение разрешений текстурыLower texture resolutions
  2. Использование меньшего числа текстур (нормалей, отраженных и т. д.)Use fewer textures (normals, specular, and so on)

Скорость заполнения сосредоточена на уменьшении количества операций, которые необходимо вычислить для итогового отрисованного пикселя, включая:Fill rate is focused on reducing the number of operations that need to be computed for a final rendered pixel, including:

  1. Число объектов для отрисовки или обработкиNumber of objects to render/process
  2. Число операций на шейдерNumber of operations per shader
  3. Число стадий GPU до окончательного результата (шейдеры Geometry, эффекты последующей обработки и т. д.)Number of GPU stages to final result (geometry shaders, post-processing effects, and so on)
  4. Число пикселей для отрисовки (разрешение экрана)Number of pixels to render (display resolution)

Уменьшить число многоугольниковReduce polygon count

Чем больше число многоугольников, тем больше операций для GPU, тем самым уменьшая количество многоугольников в сцене, тем меньше время визуализации.Higher polygon counts result in more operations for the GPU, so reducing the number of polygons in your scene reduces the render time. Есть и другие факторы, которые делают геометрические объекты геометрическими, но количество многоугольников является самой простой метрикой, определяющей объем работы, которую займет визуализация сцены.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.

Ограничение перерисовкиLimit overdraw

Высокая перерисовка происходит, когда несколько объектов визуализируются, но не отображаются на экране, так как они скрыты объектом окклудинг.High overdraw occurs when multiple objects are rendered but not shown on screen as they're hidden by an occluding object. Представьте себе, что у стены есть объекты, находящиеся за ней.Imagine looking at a wall that has objects behind it. Вся геометрия будет обработана для подготовки к просмотру, но необходимо будет визуализировать только непрозрачную стену, что приведет к ненужным операциям.All of the geometry would be processed for rendering, but only the opaque wall needs to be rendered, which results in unnecessary operations.

ШейдерыShaders

Шейдер — это небольшие программы, которые работают на GPU и выполняют два важных шага при подготовке к просмотру:Shaders are small programs that run on the GPU and do two important steps in rendering:

  1. Определение того, какие вершины должны рисоваться и где они находятся в пространстве экрана (шейдер вершин)Determining which vertices should be drawn and where they are in screen space (the Vertex shader)
    • Шейдер вершин выполняется на вершину для каждой сетки.The Vertex shader is executed per vertex for every mesh.
  2. Определение цвета каждого пикселя (шейдер пикселей)Determining the color of each pixel (the Pixel shader)
    • Построитель текстуры выполняется на пиксель и визуализируется с помощью геометрии в целевую текстуру рендеринга.The Pixel shader is executed per pixel and rendered by the geometry to the target render texture.

Обычно шейдеры выполняют много преобразований и вычислений освещения.Typically, shaders do many transformations and lighting calculations. Хотя сложные модели освещения, тени и другие операции могут создавать отличные результаты, они также поставляются с ценой.Although complex lighting models, shadows, and other operations can generate fantastic results, they also come with a price. Уменьшение числа операций, вычисленных в шейдере, может значительно снизить объем работы, необходимый для GPU на кадр.Reducing the number of operations computed in shaders can greatly reduce the work needed for the GPU per frame.

Рекомендации по кодированию шейдераShader coding recommendations
  • Используйте фильтрацию билинейной, когда это возможноUse bilinear filtering, whenever possible
  • Переупорядочение выражений для использования встроенных функций MAD для умножения и добавления в одно и то же времяRearrange expressions to use MAD intrinsics to do a multiply and an add at the same time
  • Предварительно вычислить как можно больше ресурсов ЦП и передать его в качестве констант в материалPrecalculate as much as possible on the CPU and pass as constants to the material
  • Предпочитать операции перемещения из шейдера пикселей к шейдеру вершинFavor moving operations from the pixel shader to the vertex shader
    • Как правило, количество вершин намного меньше числа пикселов (720p — 921 600 пикселей, 1080p — 2 073 600 пикселей и т. д.)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)

Удалить этапы GPURemove GPU stages

Эффекты последующей обработки могут быть дорогостоящими и увеличивать скорость заполнения приложения, включая такие приемы сглаживания, как MSAA.Post-processing effects can be expensive and increase the fill rate of your application, including anti-aliasing techniques like MSAA. В HoloLens мы рекомендуем избегать этих приемов и дополнительных стадий шейдера, таких как Geometry, поверхности и шейдеры вычислений.On HoloLens, we recommended avoiding these techniques and additional shader stages such as geometry, hull, and compute shaders.

Рекомендации по использованию памятиMemory recommendations

Чрезмерная операция выделения и освобождения памяти может привести к нестабильной производительности, замороженным кадрам и другим неблагоприятным результатам.Excessive memory allocation and deallocation operations can result in inconsistent performance, frozen frames, and other detrimental behavior. Особенно важно понимать требования к памяти при разработке в Unity, так как управление памятью контролируется сборщиком мусора.It's especially important to understand memory considerations when developing in Unity, since memory management is controlled by the garbage collector.

Использование пулов объектовObject pooling

Пул объектов — это популярная методика снижения затрат на непрерывное выделение и освобождение объектов.Object pooling is a popular technique to reduce the cost of continuous allocations and deallocations of objects. Для этого выделяется большой пул идентичных объектов, из которого извлекаются для повторного использования доступные и неактивные экземпляры. Это эффективнее, чем постоянный процесс создания и уничтожения объектов.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. Пулы объектов отлично подходят для многократно используемых компонентов с переменными периодами жизни в приложении.Object pools are great for reuseable components that have variable lifetime during an app.

См. также статьюSee also