-
Unity Oculus Quest 최적화개발/Unity 2020. 2. 5. 16:56
Testing and Performance Analysis
Testing and Performance Analysis In this guide, we’ll review baseline targets, recommendations, tools, resources, and common workflows for performance analysis and bug squashing for Unity VR applications. General Tips VR application profiling provides insi
developer.oculus.com
오큘러스 퀘스트는 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에서 봤을 때는 플레이가 어려울 정도로 크게 느껴진다.
Seven stages of optimizing mobile VR content in Unity - Unity
From one of Unity's technical artists: The seven stages covering everything that takes processing time in your game–from the game loop to the render loop–and how to optimize along the way.
unity3d.com
우선적으로 높은 주사율을 확보하는 것을 목적으로 했는데, 모바일 VR을 위해 쉽게 최적화할 수 있는 부분부터 진행해 보았다. 위 공식 포스팅에 따르면 최적화를 위해 먼저 할 수 있는 것들은 다음과 같다.
Static, dynamic batching 활성화
동일한 Material을 사용하는 어려 오브젝트를 한 번의 Draw call로 그린다. Static object들의 경우는 하나의 커다란 Mesh로 표현할 수 있고, File > Project Setting > Player에서 수정할 수 있다.
Unity - Manual: Draw call batching
Optimizing graphics performance Rendering Statistics Window Draw call batching To draw a GameObjectThe fundamental object in Unity scenes, which can represent characters, props, scenery, cameras, waypoints, and more. A GameObject’s functionality is defined
docs.unity3d.com
Shadow mapping 비활성화
카메라의 위치를 광원과 일치시켰을 때의 depth buffer가 shadow buffer과 같다.
Unity - Manual: Shadows
Shadows Unity’s lights can cast Shadows from an object onto other parts of itself or onto other nearby objects. Shadows add a degree of depth and realism to a scene since they bring out the scale and position of objects that can otherwise look “flat”. Scen
docs.unity3d.com
Procedural skybox, skybox lighting 비활성화
Source를 Skybox에서 Color로 변경하고 Material과 비슷한 색상의 Ambient color를 적용했다 Runtime global illumination 비활성화
기본적으로 비활성화되어 있는 경우가 많다 Lightmap size를 4096으로 확대
빌드 시간이 조금 늘어나지만, Baked 광원의 질을 높일 수 있다 모든 Light 컴포넌트의 Mode를 Baked로 변경
Realtime에서 Baked 또는 Mixed로 변경한다 모든 Emissive shader 의 전역광 설정을 baked로 변경
Emissive shader은 Light component보다 성능에 미치는 영향이 크다 다시 빌드한 결과 렉이 확실히 줄어들어 녹화를 하지 않을 경우에는 대부분의 상황에서 72hz정도의 주사율이 유지된다. 하지만 실시간 그림자가 비활성화되는 등 확실히 퀄리티가 떨어졌음을 느낄 수 있었다. 이 부분에 대해서는 이후 타협이 필요할 것으로 보인다.
이후 위 영상에 보이는 복잡한 배경 건물 애셋을 삭제하고 조명의 수를 줄였을 때 적당한 주사율을 확보할 수 있었다. 광원의 수가 적을 때는 모델의 폴리곤 수도 큰 영향을 미칠 수 있으므로, VR 개발 시에는 실시간 게임용으로 제작된 LowPoly 모델을 사용하는 것이 좋겠다.
실시간 조명을 대체하기 위한 Light Probe 배치
Oculus link를 사용해 유니티 에디터에서 바로 테스트할 때는 PC의 성능을 사용하므로 퀘스트에서 어떤 성능을 낼 지 알 수 없다. 조명와 오브젝트의 갯수를 조절하면서 적당한 속도가 확보될 때 까지 반복해서 빌드를 하며 확인해 봐야 한다.
유니티 에디터 Profiler 로 실행했을 때의 CPU 사용량. 여기서는 퀘스트에서의 성능을 정확히 알 수 없다. 그래프에서 보이는 CPU 사용량의 급격한 변화는 유니티 EditorLoop으로, 퀘스트 빌드 시에는 포함되지 않는다.
Game 윈도우에서 Stats을 확인 https://developer.oculus.com/documentation/unity/unity-perf/ 모든 모델을 LowPoly로 사용했음에도 일단 Batches 수와 폴리곤, 버텍스 수가 매우 많다. 최적화를 통해 이를 Performance Target 아래로 낮춰야 한다.
오큘러스 블로그의 모바일 VR 최적화 포스팅을 참고.
Tech Note: Unity Settings for Mobile VR | Oculus
Unity provides a lot of checkboxes and drop-down menus to tweak the behavior and performance of your app. When starting a new project, it can be hard to know which settings are appropriate for the project. This post discusses the appropriate Unity settings
developer.oculus.com
우선 카메라에서 Clipping Plane 최대 거리를 설정하고 Occlusion Culling을 사용했다. 잘 적용되어 Camera 밖의 오브젝트들은 잘 숨겨지는데. Stats에 보이는 버텍스 갯수가 크게 줄어들지는 않는다. 대부분의 경우 100k 정도 줄긴 했는데 여전히 너무 많다.
아무 오브젝트도 없는 뒤쪽을 보았을때도 5k 밑으로 내려가지 않는 이유는? (비어있는 Scene에서 테스트해본 결과 Oculus에서 제공하는 손 모델만으로도 6k폴리곤 정도를 차지한다. 이 때문일 수도)
일단 Occlusion Culling은 효과가 있다. 다음은 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