제품 소식

Unity로 Android XR 성능 최적화

전문 길이: 6분
Luke Hopkins
개발자 관계팀 엔지니어, Android

Android XR 기반의Samsung Galaxy XR이 출시되었습니다. 이 블로그 게시물은 Android XR Spotlight Week의 일부로, Android XR용 앱을 학습, 빌드, 준비하는 데 도움이 되도록 설계된 블로그 게시물, 동영상, 샘플 코드 등의 리소스를 제공합니다.  

이번 주에 Samsung은 Google 및 Qualcomm과 협력하여 개발한 Galaxy XR을 출시했습니다. 개발자에게는 흥미로운 시기이며 Google은 XR 앱에서 최고의 성능을 얻을 수 있도록 지원하고자 합니다.

비 XR 기기의 게임 및 앱에서 성능이 저하되면 사용자가 불편함을 느낄 수 있지만 XR의 세계에서는 성능이 선택사항이 아니라 앱의 성공에 기본적인 요소입니다. XR에서 프레임 속도 목표를 놓치면 멀미와 같은 훨씬 더 심각한 문제가 발생할 수 있습니다. 

이 가이드에서는 Android XR 개발을 위해 이해해야 하는 필수 성능 최적화를 안내합니다. 가장 큰 성능 향상을 제공하는 기능, 사용 시기, 프레임 속도 목표를 달성하는 데 도움이 되도록 함께 작동하는 방법을 알아봅니다.

목표는 다음과 같습니다.

  • 최소: 72fps (Google Play 품질 가이드라인의 일부)
  • 선택사항: 프레임당 11ms 예산으로 90fps

이러한 높은 프레임 속도를 유지하는 것이 중요한 이유에 관한 자세한 내용은 성능 가이드라인을 참고하세요.   

XR 관련 성능 기능

먼저 XR 관련 성능 기능인 시선 추적 렌더링과 Vulkan 서브샘플링을 살펴보겠습니다. 

시선 추적 렌더링

시선 추적 렌더링은 두 가지 모드가 있는 최적화입니다. 첫 번째는 화면 중앙을 더 높은 해상도로 렌더링하고 멀리 볼수록 해상도를 점진적으로 낮추는 정적 모드 입니다.

두 번째는 주변기기에 표시되는 품질을 줄이면서 사용자가 보고 있는 영역을 구체적으로 렌더링하는 시선 추적 모드 입니다. 기본적으로 인간의 시각이 작동하는 방식을 모방합니다. 즉, 우리가 집중하고 있는 특정 영역에서만 세부정보를 볼 수 있습니다.

시선 추적 렌더링은 사용자가 인식하는 이미지 품질을 저하시키지 않고 GPU 워크로드를 크게 줄입니다. 시선 추적 렌더링의 장점은 사용자가 주변 시야에서 품질 저하를 인식하지 못하지만 GPU는 성능 향상을 확실히 인식한다는 것입니다.

복잡한 3D 아티팩트로 박물관 환경을 빌드한다고 가정해 보겠습니다. 시선 추적 렌더링이 없으면 '시야'에서 모든 것을 렌더링하려고 할 때 90fps를 유지하기가 어렵습니다. 시선 추적 렌더링을 사용하면 사용자가 보고 있는 위치에 높은 폴리 세부정보를 유지할 수 있지만 배경 환경은 낮은 품질로 렌더링됩니다. 사용자는 차이를 인식하지 못하지만 장면의 세부정보를 추가할 여유가 있습니다.

Vulkan 서브샘플링

Vulkan 서브샘플링은 시선 추적 렌더링의 가장 친한 친구입니다. 시선 추적 렌더링은 다양한 품질 수준에서 렌더링할 항목을 결정하는 반면 Vulkan 서브샘플링은 프래그먼트 밀도 맵을 사용하여 다양한 품질 수준을 효율적으로 렌더링하는 방법을 처리 합니다.

시선 추적 렌더링과 결합하면 Vulkan 서브샘플링은 0.5ms의 성능을 추가로 제공합니다. 또한 주변 시야에서 들쭉날쭉한 가장자리를 부드럽게 하여 전체 이미지를 더 깔끔하게 보이도록 합니다.

예를 들어 사용자가 계기판과 컨트롤에 집중하는 비행 시뮬레이터 게임에서 시선 추적 렌더링과 Vulkan 서브샘플링을 결합하면 세부 컨트롤이 선명하게 렌더링되지만 주변 조종석 구조는 더 적은 리소스를 사용합니다. 0.5ms는 많지 않은 것처럼 보이지만 추가 대화형 요소를 위한 공간이 있거나 격렬한 순간에 프레임이 삭제되는 것과는 다릅니다.

복잡한 장면을 위한 GPU 기능

시선 추적 렌더링 및 Vulkan 서브샘플링 외에도 스마트 인스턴스화 및 컬링을 통해 불필요한 부담을 줄이는 일부 GPU 기능이 있습니다. 이러한 기능은 반복되는 도형 또는 상당한 폐색이 있는 복잡한 장면에서 특히 효과적입니다.

GPU Resident Drawer

GPU Resident Drawer는 GPU 인스턴스화를 자동으로 사용하여 그리기 호출을 줄이고 CPU 처리 시간을 확보합니다. 따라서 CPU가 GPU에 각 객체를 개별적으로 알리는 대신 GPU는 유사한 객체를 일괄 처리합니다.

이 기능은 숲의 나무, 사무실 건물의 가구 또는 환경 전체에 흩어져 있는 소품과 같이 반복되는 메시가 있는 대규모 장면에서 가장 효과적입니다.

동일한 기본 메시를 사용하는 200개의 나무가 있는 숲 장면을 상상해 보세요. GPU Resident Drawer가 없으면 GPU를 사용하는 200개의 그리기 호출이 있으므로 CPU가 확보됩니다. 이 기능을 사용 설정하면 GPU가 이러한 나무를 지능적으로 인스턴스화하여 그리기 호출을 5~10개로 줄입니다. 이는 게임플레이 로직 또는 물리 계산에 투자할 수 있는 엄청난 GPU 절감 효과입니다.

GPU 폐색 컬링

GPU 폐색 컬링CPU 대신 GPU를 사용하여 숨겨진 객체를 식별하고 렌더링을 건너뜁니다. 다른 객체 뒤에 폐색된 (숨겨진) 항목을 자동으로 감지하므로 사용자가 볼 수 없는 항목에 GPU를 낭비하지 않습니다.

이 기능은 여러 방이 있는 실내 공간, 밀도가 높은 환경 또는 벽, 바닥, 객체가 자연스럽게 시야를 가로막는 건축 장면에서 특히 강력합니다.

예를 들어 여러 방이 있는 주택 환경을 빌드한다고 가정해 보겠습니다. 사용자가 거실에 있을 때 벽 뒤에 완전히 숨겨진 완전히 상세한 주방을 렌더링하는 데 GPU 주기를 낭비하는 이유는 무엇일까요? GPU 폐색 컬링은 이러한 숨겨진 객체의 렌더링을 자동으로 건너뛰므로 실제로 보이는 항목에 더 많은 성능 예산을 할당할 수 있습니다.

성능 모니터링

이러한 기능을 사용하는 것만으로는 충분하지 않습니다. 최적화의 영향을 정량화하고 변경사항이 실제로 작동하는지 확인하려면 최적화를 측정해야 합니다.

성능 측정항목 API

성능 측정항목 API는 앱의 메모리 사용량, CPU 성능, GPU 성능을 실시간으로 모니터링합니다. 컴퍼지터 및 런타임 레이어의 포괄적인 데이터를 제공하므로 애플리케이션에서 정확히 무슨 일이 일어나고 있는지 확인할 수 있습니다.

변경하기 전에 기준을 설정하고, 최적화를 적용하고, 영향을 측정하고, 반복합니다. 이 데이터 기반 접근 방식은 추측하는 것이 아니라 실제로 성능을 개선하고 있음을 알고 있다는 의미입니다.

시선 추적 렌더링을 사용 설정하기 전에 GPU 프레임 시간이 13ms일 수 있으며 이는 11ms 예산을 초과합니다. 시선 추적 렌더링을 사용 설정하고 다시 측정하면 9ms로 떨어지는 것을 확인할 수 있습니다. 이는 장면의 세부정보를 추가하거나, 다른 곳에서 시각적 품질을 개선하거나, 더 넓은 범위의 콘텐츠에서 더 원활한 성능을 보장하기 위해 확보한 4ms의 여유 공간입니다.

이러한 측정항목이 없으면 맹목적으로 최적화하는 것입니다. 성능 측정항목 API는 특정 사용 사례에 실제로 도움이 되는 항목에 관한 진실을 알려줍니다.

프레임 디버거

프레임 디버거는 장면이 프레임별로 정확히 렌더링되는 방식을 이해하기 위한 Unity의 기본 제공 도구입니다. 그리기 호출 시퀀스를 표시하고 이를 단계별로 실행하여 최적화가 올바르게 작동하는지 확인할 수 있습니다.

SRP 일괄 처리기가 작동하는지 확인하시겠어요? 프레임 디버거에서 'RenderLoopNewBatcher' 항목을 찾습니다. GPU Resident Drawer가 올바르게 일괄 처리하는지 확인하시겠어요? '하이브리드 일괄 처리 그룹' 항목을 찾습니다. 이러한 시각적 확인을 통해 최적화 설정이 실제로 적용되는지 이해할 수 있습니다.

장면의 처음 50개의 그리기 호출을 단계별로 실행합니다. 일괄 처리되는 대신 유사한 객체가 개별적으로 그려지는 경우 인스턴스화 또는 일괄 처리가 올바르게 작동하지 않는 것입니다. 프레임 디버거는 이러한 문제를 즉시 표시하므로 해결할 수 있습니다.

추가 최적화

위에서 설명한 최적화 외에도 전체 성능 가이드에서는 몇 가지 추가 최적화도 다룹니다. 다음은 간단한 요약입니다.

  • URP 설정: 모바일 XR의 HDR 및 후처리를 사용 중지합니다. 이러한 기능은 모바일 하드웨어의 성능 비용에 비해 시각적 영향이 최소화되므로 거의 인식할 수 없는 시각적 차이로 측정 가능한 성능 향상을 얻을 수 있습니다.
  • SRP 일괄 처리기: 동일한 셰이더 변형을 사용하는 여러 머티리얼이 있는 장면의 CPU 오버헤드를 줄입니다. 그리기 호출 간의 렌더링 상태 변경을 최소화하면 렌더링에 소요되는 CPU 시간을 크게 줄일 수 있습니다.
  • 디스플레이 새로고침 빈도: 장면 복잡성에 따라 72fps와 90fps 사이에서 동적으로 조정합니다. 복잡한 시퀀스 중에 프레임 속도를 낮춰 안정성을 유지한 다음 더 간단한 순간에 프레임 속도를 높여 매우 원활한 상호작용을 제공합니다.
  • 깊이/불투명 텍스처: 셰이더 효과에 특별히 필요한 경우가 아니면 사용 중지합니다. 대부분의 애플리케이션에 이점을 제공하지 않고 성능을 낭비하는 불필요한 GPU 복사 작업을 일으킵니다.
  • URP 렌더링 크기 조정: 이 설정을 사용하면 성능 이점을 위해 낮은 해상도로 렌더링하거나 시각적 품질 향상을 위해 렌더링을 업스케일링할 수 있습니다.

이러한 최적화 및 기타 최적화에 관한 단계별 안내는 Android XR용 전체 Unity 성능 가이드를 참고하세요.

결론

XR 앱의 성능은 단순한 기술 체크박스가 아닙니다. 사용자가 불편함이나 멀미를 느끼는 환경과 편안하고 몰입도 높은 환경 간의 차이입니다. 설명한 최적화는 최신 XR 기기에서 중요한 프레임 속도 목표를 달성하기 위한 툴킷입니다.

다음은 로드맵입니다.

  1. 시선 추적 렌더링 및 Vulkan 서브샘플링으로 시작합니다. 이러한 XR 관련 기능은 즉각적이고 눈에 띄는 GPU 절감 효과를 제공합니다.
  2. 반복되는 도형 또는 실내 공간이 있는 복잡한 장면이 있는 경우 GPU Resident Drawer 및 폐색 컬링을 추가합니다.
  3. 성능 측정항목 API로 모든 것을 모니터링하여 변경사항이 실제로 도움이 되는지 확인합니다.
  4. 추가 성능 여유 공간을 위해 추가 URP 최적화를 살펴봅니다.

지속적으로 측정하고 반복하는 것이 중요합니다. 모든 최적화가 모든 프로젝트에 동일한 이점을 제공하는 것은 아니므로 성능 측정항목 API를 사용하여 특정 사용 사례에 실제로 도움이 되는 항목을 명확하게 파악하세요.

다음 단계: 기술 확장

자세히 알아볼 준비가 되셨나요? 다음 리소스를 확인하세요.

작성자:

계속 읽기