VR 모드의 프레임 타이밍은 VSync 지원 비VR 모드에서와 완전히 동일하게 동작합니다(이벤트 함수 실행 순서 문서 참조). 유일한 차이는 Unity가 기본 3D SDK의 VSync가 아니라 현재 렌더링에 사용되는 VR SDK에 기반한다는 점입니다. 디스플레이 새로고침 속도보다 더 빠르게 렌더링하더라도 아무런 이점이 없습니다. 그 대신 Unity는 가장 높은 효율을 얻는 데 초점을 맞춥니다.
멀티스레드 렌더링에서 Unity는 CPU의 시뮬레이션 스레드와 렌더링 스레드를 동기화하여 지연을 줄입니다. 시뮬레이션 스레드는 주로 시뮬레이션 실행에 필요한 스크립트, 사운드, AI 및 기타 작업을 실행합니다. 렌더 스레드는 드로우 콜을 그래픽스 드라이버에 제출하는 데 초점을 맞춥니다. 그래픽스 드라이버는 드로우 콜을 확인한 후 GPU로 전송합니다. 스레드 간 병렬성을 극대화하기 위해 Unity는 그래픽스 커맨드를 들어오는 대로 실행하고 다음 프레임을 동시에 시뮬레이션합니다.
Unity는 GPU가 마지막 프레임을 완전히 렌더링하고 표시할 때까지 기다린 후 다음 프레임에 대한 렌더링 커맨드를 제출합니다.
Unity가 뷰 변환 매트릭스에 기반하는 첫 번째 렌더링 커맨드를 제출하기 전에 VR SDK에서 뷰 매트릭스를 먼저 가져와야 합니다. 지연을 최소화하기 위해 VR SDK는 프레임당 두 번의 헤드 트랜스폼을 예상합니다.
현재 프레임을 렌더링하는 하나의 예측입니다. 이 예측은 프레임이 화면에 도달할 때 헤드가 실제 공간에 있는 위치에 해당합니다.
다음 프레임을 시뮬레이션하는 하나의 예측입니다.
Unity는 현재 프레임에 대한 렌더링 예측을 카메라, 컨트롤러, 그리고 씬 렌더링 정보를 필요로 하는 여타 요소에 적용합니다. Unity는 다음 프레임을 렌더링할 수 없는 경우 다음 프레임에 대한 시뮬레이션 예측을 사용합니다.
하드웨어가 렌더링을 처리하는 방식에 대한 자세한 내용은 HMD에 대한 제조사 문서를 참조하십시오.
Unity가 다음 디스플레이 새로고침 시점까지 완전히 렌더링된 프레임을 제출하지 않으면 활성화된 VR SDK에 따라 몇 가지 상황이 발생할 수 있습니다. VR SDK는 다음을 수행할 수 있습니다.
이전에 제출된 프레임을 표시합니다. 이렇게 하면 요동치는 것처럼 보일 수 있으며 경험의 질이 크게 떨어집니다.
현재 헤드 포즈에 따라 이전에 제출된 프레임을 회전하여 재투영합니다. 이를 통해 정적 콘텐츠의 폴백으로 동작하는 근사치를 얻을 수 있지만, 애니메이션 또는 포지션 이동이 포함된 콘텐츠는 제대로 표시되지 않습니다.
포지션 재투영의 일부 형태를 적용합니다. 이렇게 하면 일시적으로 누락된 디테일을 채울 수 있습니다.
재투영(때때로 ’시간 왜곡’이라고도 불림)에 관한 자세한 내용은 Timewarp의 XinReality wiki 엔트리를 참조하십시오.
이 모든 동작은 자동으로 진행됩니다. 이 시점에는 Unity가 이미 렌더링하고 있어야 할 다음 프레임을 성공적으로 마무리하기에는 너무 늦습니다. 대신에 VR SDK가 수신된 마지막 프레임을 가져온 후 가장 최근에 예상된 포즈로 재투영합니다. 그러면 Unity는 전체 프레임을 렌더링하여 원래대로 돌아올 기회가 올 때까지 기다립니다. 앱의 프레임이 계속 드롭되면 Unity는 프레임을 하나씩 건너뛰며 렌더링합니다.
하드웨어가 렌더링을 처리하는 방식에 대한 자세한 내용은 HMD에 대한 제조사 문서를 참조하십시오.
각 디스플레이에는 Unity가 바운드되는 특정한 새로고침 속도가 있습니다. VRDevice.refreshRate를 사용하여 런타임 시점에 이를 확인할 수 있습니다. 1을 refreshRate
로 나눈 값이 단일 프레임에 할당된 시간입니다.
예를 들어 새로고침 속도가 90hz인 경우 이 값은 11.1밀리초가 될 수 있습니다.
앱이 GPU 바운드이면 Unity 프로파일러는 한 프레임(시간 단위: 밀리초)을 초과하여 XR.WaitForGPU
를 표시합니다.
앱이 CPU 바운드이면 프레임은 지정된 프레임 시간보다 오래 걸리지만, Unity 프로파일러는 한 프레임보다 짧게 XR.WaitForGPU
를 표시합니다.