혼합 현실 성능 이해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가 불안정 하 게 표시 되 고 환경에 대 한 헤드 추적이 부정확 하 게 표시 되어 사용자에 게 잘못 된 환경을 제공 합니다.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 60FPS60 FPS
Windows Mixed Reality 울트라 PcWindows Mixed Reality Ultra PCs 90 FPS90 FPS
Windows Mixed Reality PcWindows Mixed Reality PCs 60FPS60 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. 장면을 렌더링 하는 작업을 담당 하는 두 가지 기본 프로세서가 있습니다. CPU와 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. 앱 스레드-CPU - 입력, 애니메이션, 물리 및 기타 응용 프로그램 논리를 비롯 한 응용 프로그램 논리를 담당 합니다.App Thread - CPU - Responsible for your app logic, including processing input, animations, physics, and other app logic.
  2. Gpu에 대 한 그리기 호출을 전송 하는 gpu에 스레드 CPU를 렌더링 합니다.Render Thread - CPU to GPU - Responsible for submitting your draw calls to the GPU. 응용 프로그램에서 큐브나 모델 등의 개체를 렌더링 하려는 경우이 스레드는 작업을 수행 하기 위해 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 -가장 일반적으로 응용 프로그램의 그래픽 파이프라인을 처리 하 여 3d 데이터 (모델, 질감 등)를 픽셀로 변환 합니다.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 인지 아니면 CPU에 바인딩되어 있는지를 확인 하는 한 가지 방법은 렌더링 대상 출력의 해상도를 낮추는 것입니다.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. 응용 프로그램 프레임 속도가 늘어나면 GPU가 바인딩될 가능성이 높습니다.Application framerate increases, then you're likely GPU Bound
  2. 응용 프로그램 프레임 속도가 변경 되지 않은 경우 CPU 바인딩될 가능성이 높습니다.Application framerate unchanged, then you're likely CPU Bound

참고

Unity는 Xrsettings. renderViewportScale 속성을 통해 런타임에 응용 프로그램의 렌더링 대상 해상도를 쉽게 수정할 수 있는 기능을 제공 합니다.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 성능 추천 사항CPU performance recommendations

일반적으로 CPU의 혼합 현실 응용 프로그램에서 대부분의 작업은 장면의 "시뮬레이션"을 수행 하 고 응용 프로그램 논리를 처리 하는 작업을 포함 합니다.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
  • PhysicsPhysics
  • 메모리 할당Memory allocations
  • 복합 알고리즘 (예:Complex algorithms (i.e 역 기구학, 경로 찾기)inverse kinematics, path-finding)

GPU 성능 추천 사항GPU 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.
  • 채우기 비율은 GPU에서 초당 그릴 수 있는 픽셀을 나타냅니다.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에서 Xrsettings. renderViewportScale 속성을 사용 합니다.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 단계 수 (기 하 도형 셰이더, 처리 후 효과 등)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

Occluding 개체에 의해 숨겨질 때 여러 개체가 렌더링 되지만 화면에 표시 되지 않는 경우에는 높은 오버 그리기가 발생 합니다.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
  • 식의 순서를 다시 정렬 하 여 여러 곱하기를 수행 하 고 동시에 추가Rearrange expressions to use MAD intrinsics to do a multiply and an add at the same time
  • CPU에서 최대한 Precalculate 하 고 재질에 상수로 전달 합니다.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는 921600 픽셀, 1080p는 2073600 픽셀 등) 보다 훨씬 작습니다.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)

GPU 단계 제거Remove GPU stages

사후 처리 효과는 부담이 될 수 있으며 MSAA와 같은 앤티앨리어스 기법을 포함 하 여 응용 프로그램의 채우기 율을 높일 수 있습니다.Post-processing effects can be expensive and increase the fill rate of your application, including anti-aliasing techniques like MSAA. HoloLens에서는 이러한 기술과 기 하 도형, 선체 및 계산 셰이더와 같은 추가 셰이더 단계를 방지 하는 것이 좋습니다.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