-
Unity Oculus Quest 최적화개발/Unity 2020. 2. 5. 16:56
오큘러스 퀘스트는 PC와 연결 없이 작동하므로 모바일기기 수준의 사양을 갖고 있다. 하지만 자연스러운 VR을 구현하기 위해서는 일반적인 모바일 기기보다 높은 해상도(1440 x 1600 x 2)와 주사율(72Hz)이 필요하므로 최적화가 더욱 중요하다.
올인원 VR HMD 기기들은 PC와 연결 없이 작동하므로 모바일기기 수준의 사양을 갖고 있다. 퀘스트는 Qualcomm Snapdragon 835 프로세서를 장착하고 있는데, 이는 갤럭시 노트 8에 장착된 것과 같다.
하지만 자연스러운 VR을 위해서는 일반적인 모바일 기기보다 높은 해상도(1440 x 1600 x 2)와 주사율(72Hz)이 필요하므로 최적화가 더욱 중요하다.
별도의 최적화를 진행하지 않는 경우에는 폴리곤이 적은 모델만을 사용하고, 이전 글에서 Light probe를 사용해 실시간 조명 처리를 줄였음에도 Object가 많은 쪽을 바라봤을 때 심하게 끊기는 모습을 볼 수 있다. 움직임이 많은 왼손에 부착된 UI에서 특히 도드라져 보이고, 보통 30~60Hz의 PC 모니터가 아니라 72Hz의 HMD에서 봤을 때는 플레이가 어려울 정도로 크게 느껴진다.
우선적으로 높은 주사율을 확보하는 것을 목적으로 했는데, 모바일 VR을 위해 쉽게 최적화할 수 있는 부분부터 진행해 보았다. 위 공식 포스팅에 따르면 최적화를 위해 먼저 할 수 있는 것들은 다음과 같다.
Static, dynamic batching 활성화
동일한 Material을 사용하는 어려 오브젝트를 한 번의 Draw call로 그린다. Static object들의 경우는 하나의 커다란 Mesh로 표현할 수 있고, File > Project Setting > Player에서 수정할 수 있다.
Shadow mapping 비활성화
카메라의 위치를 광원과 일치시켰을 때의 depth buffer가 shadow buffer과 같다.
Procedural skybox, skybox lighting 비활성화
Runtime global illumination 비활성화
Lightmap size를 4096으로 확대
모든 Light 컴포넌트의 Mode를 Baked로 변경
모든 Emissive shader 의 전역광 설정을 baked로 변경
다시 빌드한 결과 렉이 확실히 줄어들어 녹화를 하지 않을 경우에는 대부분의 상황에서 72hz정도의 주사율이 유지된다. 하지만 실시간 그림자가 비활성화되는 등 확실히 퀄리티가 떨어졌음을 느낄 수 있었다. 이 부분에 대해서는 이후 타협이 필요할 것으로 보인다.
이후 위 영상에 보이는 복잡한 배경 건물 애셋을 삭제하고 조명의 수를 줄였을 때 적당한 주사율을 확보할 수 있었다. 광원의 수가 적을 때는 모델의 폴리곤 수도 큰 영향을 미칠 수 있으므로, VR 개발 시에는 실시간 게임용으로 제작된 LowPoly 모델을 사용하는 것이 좋겠다.
Oculus link를 사용해 유니티 에디터에서 바로 테스트할 때는 PC의 성능을 사용하므로 퀘스트에서 어떤 성능을 낼 지 알 수 없다. 조명와 오브젝트의 갯수를 조절하면서 적당한 속도가 확보될 때 까지 반복해서 빌드를 하며 확인해 봐야 한다.
유니티 에디터 Profiler 로 실행했을 때의 CPU 사용량. 여기서는 퀘스트에서의 성능을 정확히 알 수 없다. 그래프에서 보이는 CPU 사용량의 급격한 변화는 유니티 EditorLoop으로, 퀘스트 빌드 시에는 포함되지 않는다.
모든 모델을 LowPoly로 사용했음에도 일단 Batches 수와 폴리곤, 버텍스 수가 매우 많다. 최적화를 통해 이를 Performance Target 아래로 낮춰야 한다.
오큘러스 블로그의 모바일 VR 최적화 포스팅을 참고.
우선 카메라에서 Clipping Plane 최대 거리를 설정하고 Occlusion Culling을 사용했다. 잘 적용되어 Camera 밖의 오브젝트들은 잘 숨겨지는데. Stats에 보이는 버텍스 갯수가 크게 줄어들지는 않는다. 대부분의 경우 100k 정도 줄긴 했는데 여전히 너무 많다.
아무 오브젝트도 없는 뒤쪽을 보았을때도 5k 밑으로 내려가지 않는 이유는? (비어있는 Scene에서 테스트해본 결과 Oculus에서 제공하는 손 모델만으로도 6k폴리곤 정도를 차지한다. 이 때문일 수도)
다음은 Light 설정을 Mixed에서 Baked로 변경. 조명은 7개가 있었고 맵에 Dynamic 오브젝트가 많아 꽤 효과가 있을 것으로 기대했다.
이제 거의 100k 정도까지 떨어졌고, Batches 횟수는 절반 이하로 내려갔다. 하지만 render thread time은 거의 줄어들지 않았다. 72FPS 고정을 위해서인듯. 머테리얼의 Height map 속성 제거는 별 효과가 없었다.
'개발 > Unity' 카테고리의 다른 글
Unity Oculus 카메라(시점) 움직이기 (0) 2020.02.13 Unity Oculus 컨트롤러로 OVRGrabbable 오브젝트 발사하기 (0) 2020.02.06 Unity 충돌 감지 시 효과음 재생 (0) 2020.01.31 Unity 라이트 프로브와 실시간 조명 (0) 2020.01.31 Unity SerializedObject target has been destroyed 오류 해결 (0) 2020.01.23