Unity는 Android XR에 특화되어 있으며 Android XR 확장 프로그램 패키지가 필요한 성능 관련 기능을 제공합니다. 이러한 기능을 사용 설정하면 스페이스워프 및 Vulkan 서브샘플링을 통해 프레임 속도를 개선하고 GPU 부하를 줄일 수 있으며, 늦은 래칭을 사용하여 추적된 렌더링 지연 시간을 줄일 수 있습니다.
기본 요건
이 안내를 따르기 전에 다음 기본 요건을 확인하고 완료해야 합니다.
- Unity에서 프로젝트 설정의 모든 단계를 완료합니다.
- Android XR Extensions for Unity 패키지를 가져옵니다.
스페이스 워프 사용 설정
URP 애플리케이션 스페이스워프는 프레임을 하나씩 건너뛰어 합성하여 높은 프레임 속도를 유지하는 데 도움이 되는 OpenXR 최적화입니다. 이 기술은 이전 프레임의 동작 벡터와 깊이 데이터를 사용하여 픽셀이 이동해야 하는 위치를 예측하므로 컴퓨팅 성능과 에너지 사용량이 줄어듭니다.
이점
- 대체 프레임을 합성하여 GPU 렌더링 워크로드를 줄입니다.
- 계산 능력과 에너지 소비를 크게 줄입니다.
- 리프로젝션을 사용하여 사용자 움직임과 디스플레이 업데이트 간의 지연 시간을 줄입니다.
이 기능 사용 설정
- Unity 기본 메뉴에서 Edit > Project Settings를 클릭합니다.
- XR 플러그인 관리 섹션을 펼칩니다.
- 현재 XR 기기에 해당하는 탭을 선택합니다.
- OpenXR 기능 그룹 섹션으로 이동합니다.
모든 기능 섹션에서 애플리케이션 SpaceWarp을 사용 설정합니다.
Vulkan 서브샘플링 사용 설정
Vulkan 서브샘플링을 사용하면 프래그먼트 밀도 맵을 사용하여 다양한 밀도로 이미지를 생성하고 샘플링할 수 있습니다. 이 Vulkan 기능을 사용하면 화면의 여러 영역을 다양한 해상도로 렌더링하고 메모리로 전송할 수 있습니다. 이는 특히 주변 영역에서 더 낮은 해상도를 사용할 수 있는 시선 추적 렌더링에 유용합니다.
이점
- 폼 팩터에 따라 시선 추적 렌더링과 결합할 때 다양한 개선사항을 제공합니다.
- 양선형 필터링을 통해 주변 영역의 앨리어싱을 줄입니다.
- 다양한 화면 영역에서 효율적인 가변 속도 렌더링을 지원합니다.
이 기능 사용 설정
- Unity 기본 메뉴에서 Edit > Project Settings를 클릭합니다.
- XR 플러그인 관리 섹션을 펼친 다음 OpenXR을 클릭합니다.
- Android XR (확장 프로그램): 세션 관리 옆에 있는 톱니바퀴 아이콘을 클릭합니다.
서브샘플링 (Vulkan)을 사용 설정합니다.
늦은 래치 사용 설정
지연 래칭은 사용자의 물리적 움직임과 디스플레이의 결과 시각적 변경 간의 지연을 최소화하는 기술입니다. 이를 통해 프레임 생성 파이프라인의 후반에 머리 포즈를 업데이트할 수 있으므로 XR 앱의 편안함과 인지된 프레임 속도가 모두 향상됩니다. 이는 전체 프레임 시간에 가까운 입력 지연 시간을 줄여 달성됩니다.
이점
- 모션-포톤 (MTP) 지연 시간을 크게 줄입니다.
- 사용자 편안함을 개선하고 멀미를 줄입니다.
- 안정성과 정확성을 향상합니다.
이 기능 사용 설정
지연 래칭을 사용 설정하려면 런타임에 앱에 대해 이 기능을 사용 설정하세요.
private XRDisplaySubsystem xrDisplay;
private XRDisplaySubsystem.LateLatchNode lateLatchNode = XRDisplaySubsystem.LateLatchNode.Head;
void Start()
{
List<XRDisplaySubsystem> xrDisplaySubsystems = new();
SubsystemManager.GetSubsystems(xrDisplaySubsystems);
if (xrDisplaySubsystems.Count >= 1)
{
xrDisplay = xrDisplaySubsystems[0];
}
}
void Update()
{
if (xrDisplay != null)
{
transform.position += new Vector3(Mathf.Epsilon, 0, 0);
Quaternion rot = transform.rotation;
rot.x += Mathf.Epsilon;
transform.rotation = rot;
xrDisplay.MarkTransformLateLatched(transform, lateLatchNode);
}
}