이 문서에서는 Mixed Reality 앱에 대한 성능의 중요성을 소개합니다. 애플리케이션이 최적의 프레임 속도로 실행되지 않으면 사용자 환경이 저하할 수 있습니다. 홀로그램은 불안정해 보이며 환경의 헤드 추적이 부정확해지면 사용자에게 좋지 않은 환경이 발생합니다. 성능은 세련된 작업이 아니라 혼합 현실 개발을 위한 일류 기능이라고 생각해 보세요.
각 대상 플랫폼에 대한 성능 프레임 속도 값은 다음 표에 나와 있습니다.
| 플랫폼 | 대상 프레임 속도 |
|---|---|
| HoloLens | 60FPS |
| PC Windows Mixed Reality Ultra | 90FPS |
| PC Windows Mixed Reality | 60FPS |
아래 프레임워크는 대상 프레임 속도에 도달하는 모범 사례를 간략하게 설명합니다. Unity 환경에서 프레임 속도를 측정하고 개선하는 방법에 대한 팁은 Unity 문서의 성능 권장 사항을 참조하세요.
성능 병목 상태 이해
앱의 프레임 속도가 저조한 경우 첫 번째 단계는 애플리케이션이 계산 집약적인 위치를 분석하고 이해하는 것입니다. 두 개의 기본 프로세서가 장면을 렌더링하는 작업을 처리합니다( CPU 및 GPU). 각 프로세서는 Mixed Reality 앱의 다양한 측면을 처리합니다. 병목 현상이 발생할 수 있는 세 가지 주요 위치는 다음과 같습니다.
- 앱 스레드 - CPU - 입력, 애니메이션, 물리학 및 기타 앱 논리 처리를 포함하여 앱 논리를 담당합니다.
- 렌더링 스레드 - CPU에서 GPU로 - 그리 기 호출을 GPU에 제출하는 작업을 담당합니다. 앱에서 큐브 또는 모델과 같은 개체를 렌더링하려는 경우 이 스레드는 GPU에 작업을 수행하라는 요청을 보냅니다.
- GPU - 가장 일반적으로 애플리케이션의 그래픽 파이프라인을 처리하여 3D 데이터(모델, 텍스처 등)를 픽셀로 변환합니다. 궁극적으로 디바이스의 화면에 제출할 2D 이미지를 생성합니다.
일반적으로 HoloLens 애플리케이션은 GPU에 바인딩되지만 항상 바인딩되는 것은 아닙니다. 다음 섹션의 도구와 기술을 사용하여 특정 앱에 병목 현상이 발생한 위치를 파악합니다.
애플리케이션을 분석하는 방법
혼합 현실 애플리케이션에서 성능 프로필 및 잠재적 병목 상태를 이해할 수 있는 많은 도구가 있습니다.
다음은 애플리케이션에 대한 심층 프로파일링 정보를 수집하는 데 도움이 되는 몇 가지 일반적인 도구입니다.
- Intel Graphics Performance Analyzers
- Visual Studio 그래픽 디버거
- Unity 프로파일러
- Unity 프레임 디버거
- Unreal Insights
- Pix
- Unreal의 GPU 프로파일링
모든 환경에서 프로파일하는 방법
앱이 GPU인지 CPU 바인딩인지 확인하는 한 가지 방법은 렌더링 대상 출력의 해상도를 낮추는 것입니다. 계산할 픽셀 수를 줄이면 GPU 부하가 줄어듭니다. 디바이스는 더 작은 텍스처로 렌더링된 다음, 최종 이미지를 표시하는 업 샘플로 렌더링됩니다.
렌더링 해상도를 낮춘 후 다음을 수행합니다.
- 애플리케이션 프레임 속도가 증가하면GPU 바인딩 가능성이 높아질 수 있습니다.
- 애플리케이션 프레임 속도는 변경되지 않고CPU가 바인딩된 것일 수 있습니다.
참고
Unity XRSettings.renderViewportScale 속성을 통해 런타임에 애플리케이션의 렌더링 대상 해상도를 쉽게 수정할 수 있는 기능을 제공합니다. 디바이스에 표시되는 최종 이미지에 고정 해상도가 있습니다. 플랫폼은 더 낮은 해상도 출력을 샘플링하여 디스플레이에서 렌더링하기 위한 고해상도 이미지를 빌드합니다.
UnityEngine.XR.XRSettings.renderScale = 0.7f;
애플리케이션을 개선하는 방법
CPU 성능 권장 사항
일반적으로 CPU의 혼합 현실 애플리케이션에서 대부분의 작업에는 장면의 "시뮬레이션"을 수행하고 애플리케이션 논리를 처리하는 작업이 포함됩니다. 최적화 대상 영역은 다음과 같습니다.
- 애니메이션
- 물리학
- 메모리 할당
- 복잡한 알고리즘(예: 역 운동, 경로 찾기)
GPU 성능 권장 사항
대역폭 및 채우기 속도 이해
GPU에서 프레임을 렌더링할 때 애플리케이션은 메모리 대역폭 또는 채우기 속도에 의해 바인딩됩니다.
-
메모리 대역폭 은 GPU가 메모리에서 수행할 수 있는 읽기 및 쓰기 속도입니다.
- 대역폭 제한을 식별하려면 텍스처 품질을 줄이고 프레임 속도를 개선한 경우 검사.
- 채우기 속도 제한을 식별하려면 디스플레이 해상도를 낮추고 프레임 속도가 향상되는지 확인합니다.
참고
Unity 사용하는 경우 Unity 특정 GPU 성능 권장 사항을 검사. - Unity XRSettings.renderViewportScale 속성을 사용합니다.
메모리 대역폭은 일반적으로 다음 중 하나에 대한 최적화를 포함합니다.
- 낮은 텍스처 해상도
- 더 적은 텍스처 사용(일반, 반사 등)
채우기 속도는 다음을 포함하여 최종 렌더링된 픽셀에 대해 계산해야 하는 작업 수를 줄이는 데 중점을 줍니다.
- 렌더링/처리할 개체 수
- 셰이더당 작업 수
- 최종 결과에 대한 GPU 단계 수(기하 도형 셰이더, 후처리 효과 등)
- 렌더링할 픽셀 수(디스플레이 해상도)
다각형 수 감소
다각형 수가 많을수록 GPU에 대한 작업이 많아지므로 장면 의 다각형 수를 줄 이면 렌더링 시간이 줄어듭니다. 기하 도형 음영을 비싸게 만드는 다른 요인이 있지만 다각형 수는 장면을 렌더링하는 데 걸리는 시간을 결정하는 가장 간단한 메트릭입니다.
초과 인출 제한
여러 개체가 렌더링되지만 폐색 개체에 의해 숨겨질 때 화면에 표시되지 않을 때 높은 오버드롤이 발생합니다. 그 뒤에 물체가 있는 벽을 보고 있다고 상상해 보십시오. 모든 기하 도형은 렌더링을 위해 처리되지만 불투명 벽만 렌더링해야 하므로 불필요한 작업이 발생합니다.
셰이더
셰이더는 GPU에서 실행되고 렌더링에서 두 가지 중요한 단계를 수행하는 작은 프로그램입니다.
- 그려야 하는 꼭짓점 및 화면 공간의 위치 결정(꼭짓점 셰이더)
- 꼭짓점 셰이더는 모든 메시에 대해 꼭짓점당 실행됩니다.
- 각 픽셀의 색 결정(픽셀 셰이더)
- 픽셀 셰이더는 픽셀당 실행되고 기하 도형에 의해 대상 렌더링 텍스처로 렌더링됩니다.
일반적으로 셰이더는 많은 변환 및 조명 계산을 수행합니다. 복잡한 조명 모델, 그림자 및 기타 작업은 환상적인 결과를 생성할 수 있지만 가격도 함께 제공됩니다. 셰이더에서 계산되는 작업 수를 줄이면 프레임당 GPU에 필요한 작업을 크게 줄일 수 있습니다.
셰이더 코딩 권장 사항
- 가능하면 쌍선형 필터링 사용
- MAD 내장 함수를 사용하여 곱하기 및 추가를 동시에 수행하도록 식을 다시 정렬합니다.
- CPU에서 가능한 한 많이 미리 계산하고 재질에 상수로 전달합니다.
-
픽셀 셰이더에서 꼭짓점 셰이더로 작업 이동 선호
- 일반적으로 꼭짓점 수는 픽셀 수보다 훨씬 작습니다(720p는 921,600픽셀, 1080p는 2,073,600픽셀 등).
GPU 단계 제거
사후 처리 효과는 비용이 많이 들고 MSAA와 같은 앤티앨리어싱 기술을 포함하여 애플리케이션의 채우기 속도를 높일 수 있습니다. HoloLens에서는 이러한 기술과 기하 도형, 헐 및 컴퓨팅 셰이더와 같은 추가 셰이더 단계를 피하는 것이 좋습니다.
메모리 권장 사항
과도한 메모리 할당 및 할당 취소 작업으로 인해 성능이 일관되지 않고 프레임이 고정되고 기타 해로운 동작이 발생할 수 있습니다. 메모리 관리는 가비지 수집기에서 제어되므로 Unity 개발할 때 메모리 고려 사항을 이해하는 것이 특히 중요합니다.
개체 풀링
개체 풀링 은 개체의 지속적인 할당 및 할당 취소 비용을 줄이는 인기 있는 기술입니다. 이 작업은 동일한 개체의 큰 풀을 할당하고 시간이 지남에 따라 개체를 지속적으로 생성하고 파괴하는 대신 이 풀에서 사용 가능한 비활성 인스턴스를 다시 사용하여 수행됩니다. 개체 풀은 앱 중에 가변 수명이 있는 재사용 가능한 구성 요소에 적합합니다.