혼합 현실에 대한 성능 이해

이 문서에서는 Mixed Reality 앱에 대한 성능의 중요성을 이해하는 방법을 소개합니다. 애플리케이션이 최적의 프레임 속도로 실행되지 않으면 사용자 환경이 크게 저하될 수 있습니다. 홀로그램이 불안정해 보이고 환경의 헤드 추적이 부정확하여 사용자에게 좋지 않은 환경이 발생합니다. 성능은 세련된 작업이 아니라 혼합 현실 개발을 위한 첫 번째 클래스 기능으로 간주되어야 합니다.

각 대상 플랫폼에 대한 성능이 좋은 프레임 속도 값은 아래에 나열되어 있습니다.

플랫폼 대상 프레임 속도
HoloLens 60FPS
Windows Mixed Reality Ultra PC 90FPS
pc Windows Mixed Reality 60FPS

아래 프레임워크는 대상 프레임 속도에 도달하는 모범 사례를 간략하게 설명합니다. Unity 환경에서 프레임 속도를 측정하고 개선하는 방법에 대한 팁은 Unity에 대한 성능 권장 사항 문서를 참조하는 것이 좋습니다.

성능 병목 상태 이해

앱의 성능이 저조한 프레임 속도인 경우 첫 번째 단계는 애플리케이션이 계산 집약적인 위치를 분석하고 이해하는 것입니다. 장면을 렌더링하는 작업을 담당하는 두 가지 기본 프로세서가 있습니다. CPU와 GPU는 각각 Mixed Reality 앱의 다양한 측면을 처리합니다. 병목 현상이 발생할 수 있는 세 가지 주요 위치는 다음과 같습니다.

  1. 앱 스레드 - CPU - 입력, 애니메이션, 물리학 및 기타 앱 논리 처리를 포함하여 앱 논리를 담당합니다.
  2. 렌더링 스레드 - CPU에서 GPU로 - 그리기 호출을 GPU에 제출하는 작업을 담당합니다. 앱이 큐브 또는 모델과 같은 개체를 렌더링하려는 경우 이 스레드는 GPU에 작업을 수행하라는 요청을 보냅니다.
  3. GPU - 가장 일반적으로 애플리케이션의 그래픽 파이프라인을 처리하여 3D 데이터(모델, 텍스처 등)를 픽셀로 변환합니다. 궁극적으로 디바이스의 화면에 제출할 2D 이미지를 생성합니다.

프레임의 수명

일반적으로 HoloLens 애플리케이션은 GPU에 바인딩되지만 항상 바인딩되는 것은 아닙니다. 아래 도구와 기술을 사용하여 특정 앱이 병목 상태가 발생한 위치를 파악합니다.

애플리케이션을 분석하는 방법

혼합 현실 애플리케이션에서 성능 프로필 및 잠재적 병목 상태를 이해할 수 있는 많은 도구가 있습니다.

다음은 애플리케이션에 대한 심층 프로파일링 정보를 수집하는 데 도움이 되는 몇 가지 일반적인 도구입니다.

모든 환경에서 프로파일을 지정하는 방법

앱이 GPU 또는 CPU 바인딩인지 확인하는 한 가지 방법은 렌더링 대상 출력의 해상도를 낮추는 것입니다. 계산할 픽셀 수를 줄이면 GPU 부하가 줄어듭니다. 디바이스는 더 작은 텍스처로 렌더링된 다음, 최종 이미지를 표시하기 위해 업 샘플로 렌더링됩니다.

렌더링 해상도를 낮춘 후 다음을 수행합니다.

  1. 애플리케이션 프레임 속도가 증가하면GPU 바인딩 가능성이 높아질 수 있습니다.
  2. 애플리케이션 프레임 속도는 변경되지 않고CPU 바인딩된 것일 수 있습니다.

참고

Unity는 XRSettings.renderViewportScale 속성을 통해 런타임 시 애플리케이션의 렌더 타겟 해상도를 쉽게 수정할 수 있는 기능을 제공합니다. 디바이스에 표시되는 최종 이미지에는 고정 해상도가 있습니다. 플랫폼은 디스플레이에서 렌더링할 고해상도 이미지를 빌드하기 위해 저해상도 출력을 샘플링합니다.

UnityEngine.XR.XRSettings.renderScale = 0.7f;

애플리케이션을 개선하는 방법

CPU 성능 추천 사항

일반적으로 CPU의 혼합 현실 애플리케이션에서 대부분의 작업에는 장면의 "시뮬레이션"을 수행하고 애플리케이션 논리를 처리하는 작업이 포함됩니다. 다음 영역은 최적화를 대상으로 합니다.

  • 애니메이션
  • Physics
  • 메모리 할당
  • 복잡한 알고리즘(즉, 역 운동학, 경로 찾기)

GPU 성능 추천 사항

대역폭 및 채우기 속도 이해

GPU에서 프레임을 렌더링할 때 애플리케이션은 메모리 대역폭 또는 유효 노출률에 의해 제한됩니다.

  • 메모리 대역폭은 GPU가 메모리에서 수행할 수 있는 읽기 및 쓰기 비율입니다.
    • 대역폭 제한을 식별하려면 텍스처 품질을 줄이고 프레임 전송률이 개선된 경우 검사.
    • 채우기 속도 제한을 식별하려면 디스플레이 해상도를 낮추고 프레임 속도가 향상되는지 확인합니다.

참고

Unity를 사용하는 경우 Unity 관련 GPU 성능 권장 사항을 검사. - Unity에서 XRSettings.renderViewportScale 속성을 사용합니다.

일반적으로 메모리 대역폭에는 다음 중 하나에 대한 최적화가 포함됩니다.

  1. 낮은 텍스처 해상도
  2. 더 적은 텍스처 사용(일반, 반사 등)

채우기 속도는 다음을 포함하여 최종 렌더링된 픽셀에 대해 계산해야 하는 작업 수를 줄이는 데 중점을 줍니다.

  1. 렌더링/처리할 개체 수
  2. 셰이더당 작업 수
  3. 최종 결과에 대한 GPU 단계 수(기하 도형 셰이더, 후처리 효과 등)
  4. 렌더링할 픽셀 수(디스플레이 해상도)

다각형 수 줄이기

다각형 수가 많을수록 GPU에 대한 작업이 늘어나므로 장면 의 다각형 수를 줄 이면 렌더링 시간이 줄어듭니다. 기하 도형 음영을 비싸게 만드는 다른 요인이 있지만 다각형 수는 장면을 렌더링하는 데 걸리는 시간을 결정하는 가장 간단한 메트릭입니다.

과도한 그리기 제한

높은 오버드롤은 여러 개체가 렌더링되지만 가려진 개체에 의해 숨겨지므로 화면에 표시되지 않을 때 발생합니다. 그 뒤에 물체가 있는 벽을 보고 있다고 상상해 보십시오. 모든 기하 도형은 렌더링을 위해 처리되지만 불투명한 벽만 렌더링해야 하므로 불필요한 작업이 발생합니다.

셰이더

셰이더는 GPU에서 실행되고 렌더링에서 두 가지 중요한 단계를 수행하는 작은 프로그램입니다.

  1. 그릴 꼭짓점 및 화면 공간의 위치 결정(꼭짓점 셰이더)
    • 꼭짓점 셰이더는 모든 메시에 대해 꼭짓점당 실행됩니다.
  2. 각 픽셀의 색 결정(픽셀 셰이더)
    • 픽셀 셰이더는 픽셀당 실행되고 기하 도형에 의해 대상 렌더링 텍스처로 렌더링됩니다.

일반적으로 셰이더는 많은 변환 및 조명 계산을 수행합니다. 복잡한 조명 모델, 그림자 및 기타 작업은 환상적인 결과를 생성할 수 있지만 가격도 함께 제공됩니다. 셰이더에서 계산되는 작업 수를 줄이면 프레임당 GPU에 필요한 작업을 크게 줄일 수 있습니다.

셰이더 코딩 권장 사항
  • 가능하면 쌍선형 필터링 사용
  • MAD 내장 함수를 사용하여 곱하기 및 추가를 동시에 수행하도록 식 다시 정렬
  • CPU에서 가능한 한 많이 미리 계산하고 재질에 상수로 전달
  • 픽셀 셰이더에서 꼭짓점 셰이더로 작업 이동 선호
    • 일반적으로 꼭짓점 수는 픽셀 수보다 훨씬 작습니다(720p는 921,600픽셀, 1080p는 2,073,600픽셀 등).

GPU 단계 제거

사후 처리 효과는 비용이 많이 들고 MSAA와 같은 앤티앨리어싱 기술을 포함하여 애플리케이션의 채우기 속도를 높일 수 있습니다. HoloLens에서는 이러한 기술과 기하 도형, 헐 및 컴퓨팅 셰이더와 같은 추가 셰이더 단계를 피하는 것이 좋습니다.

메모리 추천 사항

과도한 메모리 할당 및 할당 취소 작업으로 인해 일관되지 않은 성능, 고정된 프레임 및 기타 해로운 동작이 발생할 수 있습니다. 메모리 관리는 가비지 수집기에서 제어되므로 Unity에서 개발할 때 메모리 고려 사항을 이해하는 것이 특히 중요합니다.

개체 풀링

개체 풀링 은 개체의 지속적인 할당 및 할당 취소 비용을 줄이는 데 널리 사용되는 기술입니다. 이 작업을 수행하려면 시간이 지남에 따라 개체를 지속적으로 만들고 삭제하는 대신, 동일한 개체의 대량 풀을 할당하고 이 풀에서 사용 가능한 비활성 인스턴스를 다시 사용합니다. 개체 풀은 앱 중에 수명이 가변적인 다시 사용할 수 있는 구성 요소에 적합합니다.

추가 정보