삼성 갤럭시 XR이 출시되었습니다. Android XR로 구동됩니다. 이 블로그 게시물은 Android XR Spotlight Week의 일환으로, Android XR용 앱을 학습, 빌드, 준비하는 데 도움이 되는 블로그 게시물, 동영상, 샘플 코드 등의 리소스를 제공합니다.
이번 주에 삼성은 Google 및 Qualcomm과 협력하여 개발한 갤럭시 XR을 출시했습니다. 지금은 개발자에게 흥미로운 시기이며, Google은 XR 앱에서 최상의 성능을 끌어낼 수 있도록 지원하고자 합니다.
XR이 아닌 기기에서 게임과 앱의 성능이 저하되면 사용자가 불편을 느낄 수 있지만, XR 환경에서 성능은 선택사항이 아니라 앱의 성공에 필수적인 요소입니다. XR에서 목표 프레임 속도를 달성하지 못하면 멀미와 같은 훨씬 더 심각한 문제가 발생할 수 있습니다.
이 가이드에서는 Android XR 개발을 위해 이해해야 하는 필수 성능 최적화에 대해 설명합니다. 어떤 기능이 가장 큰 성능 향상을 제공하는지, 언제 사용해야 하는지, 어떻게 함께 작동하여 프레임 속도 목표를 달성하는지 알아봅니다.
YouTube의 목표는 다음과 같습니다.
- 최소: 72fps (Google Play 품질 가이드라인의 일부)
- 선택사항: 90fps(프레임당 11ms 예산)
높은 프레임 속도를 유지하는 것이 중요한 이유에 관한 자세한 내용은 성능 가이드라인을 참고하세요.
XR 관련 성능 기능
먼저 포비티드 렌더링과 Vulkan 서브샘플링이라는 두 가지 XR 관련 성능 기능을 살펴보겠습니다.
포비티드 렌더링
포비티드 렌더링은 두 가지 모드가 있는 최적화입니다. 첫 번째는 화면 중앙을 더 높은 해상도로 렌더링하고 멀리 볼수록 해상도를 점진적으로 낮추는 정적 모드입니다.
두 번째는 눈 추적 모드로, 사용자가 보고 있는 영역을 세부적으로 렌더링하는 동시에 주변에 표시되는 품질을 낮춥니다. 이는 인간의 시각이 작동하는 방식을 모방한 것으로, 인간은 초점을 맞추는 특정 영역만 세부적으로 볼 수 있습니다.
포비티드 렌더링은 사용자가 인식하는 이미지 품질을 저하시키지 않으면서 GPU 워크로드를 크게 줄입니다. 포비티드 렌더링의 장점은 사용자가 주변 시야의 품질 저하를 알아차리지 못하지만 GPU는 확실히 성능 향상을 알아차린다는 것입니다.
복잡한 3D 유물을 사용해 박물관 환경을 구축한다고 가정해 보겠습니다. 포비티드 렌더링이 없으면 '시야'에 있는 모든 것을 렌더링하려고 할 때 90fps를 유지하기가 어렵습니다. 포비티드 렌더링을 사용하면 사용자가 보는 곳의 하이폴리 디테일을 유지할 수 있지만 배경 환경은 더 낮은 품질로 렌더링됩니다. 사용자는 차이를 알아차리지 못하지만 개발자는 장면에 세부정보를 더 추가할 수 있는 여유를 갖게 됩니다.
Vulkan 서브샘플링
Vulkan 서브샘플링은 포비티드 렌더링과 함께 사용하면 좋습니다. 포비티드 렌더링은 다양한 품질 수준에서 렌더링할 항목을 결정하는 반면, Vulkan 하위 샘플링은 프래그먼트 밀도 맵을 사용하여 다양한 품질 수준을 효율적으로 렌더링하는 방법을 처리합니다.
포비티드 렌더링과 결합하면 Vulkan 하위 샘플링을 통해 성능이 0.5ms 더 향상됩니다. 또한 주변 시야의 울퉁불퉁한 가장자리를 부드럽게 처리하여 전체 이미지를 더 깔끔하게 보이게 합니다.
예를 들어 사용자가 계기판과 컨트롤에 집중하는 비행 시뮬레이터 게임에서 포비티드 렌더링을 Vulkan 하위 샘플링과 결합하면 세부적인 컨트롤은 선명하게 렌더링되지만 주변 조종석 구조는 더 적은 리소스를 사용합니다. 0.5밀리초는 큰 차이가 아닌 것처럼 보이지만, 상호작용 요소를 추가할 여유가 있는지 아니면 중요한 순간에 프레임을 건너뛰어야 하는지를 결정하는 차이입니다.
복잡한 장면을 위한 GPU 기능
포비티드 렌더링과 Vulkan 서브샘플링 외에도 스마트 인스턴스화와 컬링을 통해 불필요한 부담을 줄이는 GPU 기능이 있습니다. 이는 반복되는 도형이나 상당한 가림이 있는 복잡한 장면에 특히 효과적입니다.
GPU 상주 창
GPU Resident Drawer는 GPU 인스턴싱을 자동으로 사용하여 그리기 호출을 줄이고 CPU 처리 시간을 확보합니다. 따라서 CPU가 GPU에 각 객체에 대해 개별적으로 알리는 대신 GPU가 유사한 객체를 일괄 처리합니다.
이 기능은 숲의 나무, 사무실 건물의 가구, 환경 전체에 흩어져 있는 소품과 같이 반복되는 메시가 있는 대규모 장면에 가장 효과적입니다.
동일한 기본 메시를 사용하는 200그루의 나무가 있는 숲 장면을 상상해 보세요. GPU Resident Drawer가 없으면 200개의 그리기 호출이 GPU를 소모하므로 CPU가 확보됩니다. 이 기능을 사용 설정하면 GPU가 이러한 나무를 지능적으로 인스턴스화하여 그리기 호출을 5~10회로 줄입니다. 이렇게 하면 GPU를 대폭 절약하여 게임플레이 로직이나 물리 계산에 투자할 수 있습니다.
GPU 오클루전 컬링
GPU 오클루전 컬링은 CPU 대신 GPU를 사용하여 숨겨진 객체를 식별하고 렌더링을 건너뜁니다. 다른 객체 뒤에 가려진 (숨겨진) 부분을 자동으로 감지하므로 사용자가 볼 수 없는 부분에 GPU를 낭비하지 않습니다.
이 기능은 여러 개의 방이 있는 실내 공간, 밀집된 환경 또는 벽, 바닥, 물체가 자연스럽게 시야를 가리는 건축 장면에서 특히 유용합니다.
예를 들어 멀티룸 집 경험을 빌드한다고 가정해 보겠습니다. 사용자가 거실에 있을 때 벽 뒤에 완전히 숨겨진 주방을 세부적으로 렌더링하는 데 GPU 주기를 낭비할 필요가 없습니다. GPU 오클루전 컬링은 숨겨진 객체의 렌더링을 자동으로 건너뛰어 실제로 보이는 부분에 더 많은 성능 예산을 할당합니다.
실적 모니터링
이러한 기능을 사용하는 것만으로는 충분하지 않습니다. 또한 최적화를 측정하여 그 영향을 정량화하고 변경사항이 실제로 효과가 있는지 확인해야 합니다.
Performance Metrics API
Performance Metrics API는 앱의 메모리 사용량, CPU 성능, GPU 성능을 실시간으로 모니터링합니다. 컴포지터 및 런타임 레이어의 포괄적인 데이터를 제공하므로 애플리케이션에서 어떤 일이 일어나고 있는지 정확하게 확인할 수 있습니다.
변경하기 전에 기준을 설정하고, 최적화를 적용하고, 영향을 측정하고, 반복합니다. 이러한 데이터 기반 접근 방식을 사용하면 추측에 의존하지 않고 실제로 실적을 개선하고 있는지 확인할 수 있습니다.
포비티드 렌더링을 사용 설정하기 전에는 GPU 프레임 시간이 13ms로, 예산인 11ms를 초과할 수 있습니다. 포비티드 렌더링을 사용 설정하고 다시 측정하면 9ms로 떨어지는 것을 확인할 수 있습니다. 이렇게 확보한 4ms의 여유 시간으로 장면에 더 많은 디테일을 추가하거나, 다른 부분의 시각적 품질을 개선하거나, 더 다양한 콘텐츠에서 더 원활한 성능을 보장할 수 있습니다.
이러한 측정항목이 없으면 최적화가 제대로 이루어지지 않습니다. Performance Metrics API는 특정 사용 사례에 실제로 도움이 되는 사항을 알려줍니다.
프레임 디버거
프레임 디버거는 장면이 프레임별로 렌더링되는 방식을 정확하게 이해할 수 있는 Unity의 기본 제공 도구입니다. 그리기 호출 시퀀스를 표시하고 이를 단계별로 진행하여 최적화가 제대로 작동하는지 확인할 수 있습니다.
SRP Batcher가 작동하는지 확인하고 싶으신가요? 프레임 디버거에서 'RenderLoopNewBatcher' 항목을 찾습니다. GPU Resident Drawer가 제대로 일괄 처리되고 있는지 확인 중입니다. 'Hybrid Batch Group' 항목을 찾습니다. 이러한 시각적 확인을 통해 최적화 설정이 실제로 적용되고 있는지 파악할 수 있습니다.
장면의 처음 50개 그리기 호출을 단계별로 실행합니다. 유사한 객체가 일괄 처리되지 않고 개별적으로 그려지는 경우 인스턴스화 또는 일괄 처리가 제대로 작동하지 않는 것입니다. 프레임 디버거를 사용하면 이러한 문제를 즉시 확인하고 해결할 수 있습니다.
추가 최적화
위에서 다룬 최적화 외에도 전체 실적 가이드에서는 몇 가지 추가 최적화도 다룹니다. 간단히 요약하면 다음과 같습니다.
- URP 설정: 모바일 XR의 HDR 및 후처리를 사용 중지합니다. 이러한 기능은 모바일 하드웨어의 성능 비용에 비해 시각적 영향이 최소화되므로 시각적 차이가 거의 느껴지지 않으면서도 측정 가능한 성능 향상을 얻을 수 있습니다.
- SRP Batcher: 동일한 셰이더 변형을 사용하는 여러 머티리얼이 있는 장면의 CPU 오버헤드를 줄입니다. 그리기 호출 간의 렌더링 상태 변경을 최소화하면 렌더링에 소요되는 CPU 시간을 크게 줄일 수 있습니다.
- 화면 재생 빈도: 장면의 복잡성에 따라 72fps와 90fps 사이에서 동적으로 조정됩니다. 복잡한 시퀀스에서는 프레임 속도를 낮춰 안정성을 유지하고, 단순한 순간에는 프레임 속도를 높여 매우 부드러운 상호작용을 제공합니다.
- 깊이/불투명 텍스처: 셰이더 효과에 특별히 필요하지 않은 경우 사용 중지합니다. 이러한 작업은 불필요한 GPU 복사 작업을 유발하여 대부분의 애플리케이션에 이점을 제공하지 않고 성능을 낭비합니다.
- URP 렌더링 배율: 이 설정을 사용하면 성능 향상을 위해 낮은 해상도로 렌더링하거나 시각적 품질을 개선하기 위해 렌더링을 업스케일링할 수 있습니다.
이러한 최적화 및 기타 최적화에 관한 단계별 안내는 Android XR용 Unity 성능 가이드 전문을 참고하세요.
결론
XR 앱의 성능은 단순히 기술적인 체크박스가 아닙니다. 이는 편안하고 몰입도 높은 경험과 사용자가 멀미를 느끼거나 불편함을 느끼는 경험의 차이입니다. 지금까지 살펴본 최적화는 최신 XR 기기에서 중요한 프레임 속도 목표를 달성하기 위한 도구입니다.
로드맵은 다음과 같습니다.
- 포비티드 렌더링과 Vulkan 서브샘플링부터 시작하세요. 이러한 XR 전용 기능은 즉각적이고 눈에 띄는 GPU 절감 효과를 제공합니다.
- 반복되는 도형이나 내부 공간이 있는 복잡한 장면이 있는 경우 GPU Resident Drawer 및 Occlusion Culling을 추가합니다.
- Performance Metrics API를 사용하여 모든 항목을 모니터링하여 변경사항이 실제로 도움이 되는지 확인합니다.
- 추가 성능 여유를 위한 추가 URP 최적화 살펴보기
지속적으로 측정하고 반복하는 것이 중요합니다. 모든 최적화가 모든 프로젝트에 동일하게 도움이 되는 것은 아니므로 Performance Metrics API를 사용하여 특정 사용 사례에 실제로 도움이 되는 것이 무엇인지 명확하게 파악하세요.
다음 단계: 기술 확장
자세히 알아볼 준비가 되셨나요? 다음 리소스를 살펴봐 주시기 바랍니다.
-
제품 소식Android XR에서 Unreal Engine과 Godot을 공식적으로 지원한다는 소식을 알려드립니다. 또한 생산성을 높이고 새로운 XR 기능을 지원하도록 설계된 새로운 도구인 Android XR 엔진 허브와 Android XR 상호작용 프레임워크도 출시합니다.
Luke Hopkins, Ryan Bartley • 읽는 데 4분 소요 -
제품 소식향후 Android 출시 버전을 타겟팅하는 앱은 더 이상 WRITE_CONTACTS 권한을 사용하여 연락처에 직접 쓸 수 없습니다.
Roxanna Aliabadi Walker • 읽는 데 6분 소요 -
제품 소식에이전트형 개발이 가속화됨에 따라 Android 엔지니어링은 흥미로운 새로운 영역에 도달하고 있습니다. 즉, 보조 코드 완성에서 개발자의 지시에 따라 엔드 투 엔드로 실행되는 에이전트로 전환되고 있습니다. 사용하는 모델과 에이전트를 완전히 자유롭게 선택하고 유연하게 사용할 수 있습니다.
Jason Buchel • 읽는 데 3분 소요
Android 개발 관련 최신 정보를 이메일로 받아 보세요.