지금 작업중인게 최종적으로는 모바일, 1차로 안드로이드를 목표로 하기 때문에 최적화를 위한 고민이 생겼다. 몇가지를 찾아봤는데, 명쾌하게 정리된걸 못찾다가 Unity: Android Optimization Guide 라는 블로그를 찾았다. 제일 잘 정리된거 같아서 몇가지 추려 정리해보려한다.
1. 프로파일링
어디서든 개발시 최적화라면 프로파일링을 생각해야한다. 유니티도 당연히 이를 지원하며, 모바일도 SDK를 이용한 리모트 프로파일링도 가능한거 같다. 다만, 지금 작업이 완성과 거리가 먼 상태라서 나중에 다시 정리할 필요가 있다. 관심있는 사람은 원글을 보시길 바란다. 원 글에서 또하나 언급하는게 다양한 디바이스에서 테스트 하라는 것. 아마도 경험적인 이유가 아닐까 생각한다. 여러 디바이스를 테스트 하는게 1인 또는 소규모 개발에서 어려운점이 있긴 하지만, 리모트로 테스트를 대신해주는 서비스도 있고 방법이 있는 것으로 알고 있다. 이것도 지금은 요원한 문제이니 다음에.
2. 스크립트 최적화
먼저 찾았던 유니티 공식 영상에서도 프로파일링과 스크립트 최적화에 대해 설명한 것이 있었다. 2016년도 영상이지만 공통 적용가능한 내용이니 참고해서 보는 것도 좋을 것이다. 현재로서 가장 큰 관심사는 유니티 자체의 퀄리티등 셋팅이기 때문에 간단하게 짚고 넘어가겠다.
1) Update() 에 모든걸 때려넣지 마라
알다시피, Update()는 매 프레임마다 실행되는 코드이다. 여기에 코드가 많아지면 당연히 부하가 커지게된다. 사용자 입력같은 경우는 꼭 필요하겠지만, 코드 추가시 과연 매프레임 호출되어야 하는 코드인지 생각해볼 필요가 있다.
매 프레임 호출될 필요가 없는 코드라면 코루틴을 이용할 수 있다. 코루틴은 매 프레임마다 콜백처럼 불리지만, 프레임들을 건너 뛰거나 특정시간동안 쉬게 만들수도 있다. 많이 쓰는 api는 다음과 같은 것들이 있다.
yield return new WaitForSeconds(1); yield return new WaitForEndOfFrame (); yield return new WaitForFixedUpdate();
초당 30프레임만 가정해봐도 매 프레임 계산을 안한다는게 성능개선에 큰 도움이 될거라는걸 예측할 수 있다.
3. 물리엔진
당연한 얘기겠지만, 부하가 많은 계산이 많은 부분이므로 사용을 최소화 해야한다. 동적인 Rigidbody를 최소화하고, Mesh collider는 사용하지말자. 충돌검사 부분의 계산이 많으므로 계산이 간단한 기본형태의 collider만 사용한다.
Collider 컴포넌트에 보면, Discrete/Dynamic 등이 있는데 discrete가 계산량이 적으므로 가능하면 discrete 사용.
Edit > Project Settings > Time 항목을 보면, Fixed Timestep이 있다. 이게 바로 FixedUpdate() 호출 간격이다. 이 값을 줄이면, 더 자주 계산이 이루어지고 정확해지고 늘리면, 계산량이 줄고 부정확해질 것이다. 필요하다면 조정 가능하겠지만, 충분히 이해하지 못했다면 안건드리는게 나을 거 같다.
4. 렌더링 최적화
아마도 가장 직관적이고 바로 효과를 보며 필요한 내용이 아닐까 생각한다.
동적 lighting을 가능하면 쓰지말고 투명 기능은 그냥 안쓰는게좋다. 이 두가지의 계산량이 어마어마하다. 대신 그럴싸하게 보이도록하는 방법들이 있는데, 그 중 하나가 Baking 이다. 빵을 굽는 것처럼 음영지역을 미리 계산하여 텍스쳐에 추가하는 원리이다.
유니티에선 광원에 mode 항목설정을 변경하면 된다. Realtime/Mixed/Baked 가 있는데, 이를 Baked로 설정한다. Mixed로 하고 대부분 오브젝트를 static으로 설정하는 것도 가능할 것이다. Lighting mode에 대해선 공식 메뉴얼을 참고 바란다.
Baked모드 사용시, 움직이는 물체에 대해 원하는 효과를 보지 못할 것이다. 해당 글에선 이를 해결하기 위해 Light Probe를 사용하라고 말하고 있다. 제대로 사용해보진 못했지만, 미리 지정한 공간의 포인트들에서 미리 빛정보를 계산하고 런타임시 이를 활용해서 속도를 높이는 방식으로 알고 있다.
그림자의 경우도 프로젝션 텍스쳐를 사용해 유사한 효과를 낼 수 있다고한다.
5. Dynamic light를 사용해야 한다면?
쓰지 말라고 했지만, Dynamic Light을 완전히 안쓰기 힘들것이다. 어쩔 수 없이 사용하는 경우, 최적화 설정에 대해 얘기해보자. Edit > Project Settings > Quality에 세부 설정들이 들어있다. 자세한건 유니티 매뉴얼을 참고하자.
Pixel Count : 1 또는 0으로한다. 0은 광원이 없는 경우.
Antialiasing : 쓰지말자. PC게임도 이 설정에 따라 엄청난 속도차가 오는걸 알거다.
Soft Particle : 안쓰면 끄라고 하는데, 매뉴얼 보면 누가봐도 부하가 크게 걸리는 녀석인거 같다. 또한, depth textures를 지원해야 동작하는 부분이라고 하니 끄자.
Shadows : Soft shadow는 자연스럽지만, 부하가 걸리고, Hard shadow는 간단하지만, 픽셀 격자가 보여 부자연 스럽다. 아마도 그냥 끄고싶을 것이다. 앞에서 말한 프로젝션 텍스쳐를 찾아보는 것도 좋은 대안이 될 수 있다.
6. 텍스쳐
Editor Log(빌드로그)를 보면, 텍스쳐가 게임에서 메모리를 가장 많이 먹을거라고한다. 자세한 내용은 역시 매뉴얼을 참고하자.
가장 먼저 할 일은 mip maps를 생성하는 일이라고 한다. 매뉴얼에 보면, 메모리를 더 먹지만, 사용하지 않는경우 성능면에서 큰 손실이 있을거라고 나와있다. mip map은 저해상도로 빠르게 로딩 후, 차차 고해상도이미지가 보이는걸 말한다. 텍스쳐의 Advanced 항목에 Generate Mip Maps가 있을 것이다.
다음은 max size 항목이다. 사이즈 자체가 메모리를 먹는 것이므로, 적정 비쥬얼에서 최대한 max size를 줄이라고 되어있다.
마지막으로 draw call을 줄이라고 되어 있는데, textures atlas를 사용하는게 해답이 될 수 있다고 한다. textures atlas는 텍스쳐들을 합쳐서 큰 하나의 이미지로 만든 걸 말한다.
7. UI
그만좀 했으면 좋겠는데, 정리하려고 하니 왤케 항목이 많은지 모르겠다. 조금 지치는데, 아뭏튼 이제 UI다.
Sprites : 투명 영역을 최소화 하라고 한다. 텍스쳐와 마찬가지로 Generate mip maps는 필수.
Canvas : 캔버스 개수 최소화. 렌더링 프로세스에서 추가작업이 들어가는게 이유라고 한다. 캔버스가 단순히 정보를 보여주는 거라면, Graphic Raycaster 컴포넌트를 지우는 것도 도움이 된다고.
Pixel Perfect 항목 언체크하면 성능 개선 효과가 있고, 특히 스크롤 항목에서 크게 보일거라고 한다.
Text & Images : Rich text는 사용하지 않는다면 당연히 끄기. 상호작용이 없는 텍스트나 이미지는 Raycast target을 꺼주기.
Fonts : 잘못된 폰트를 사용하면 이것도 성능문제를 야기한다고 한다. 최소한의 폰트를 사용하고, 성능문제가 있을 때 Best fit을 꺼보라고 한다.
UI Material : 경험해보지 못해서 내용을 그냥 옮겨보면, Material이 비어있는 이미지나 텍스트가 성능저하를 가져온다고 한다. 이를 개선하기 위한 팁.
새 Material을 만들고, 만들어진 매터리얼의 shader 설정을 UI/Default로 한다. 그리고 이 걸 모든 텍스트와 이미지에 추가.
Scroll Rect : 그다지 최적화된 컴포넌트가 아니니 사용에 주의.
Canvas group & Menu animations : 메뉴 애니메이션을 위해서 필연적으로 disable, enable을 해야하나, 이는 game object가 초기화되는 부하가 매번 걸리므로 좋은 방법이 아니라고. Canvas group을 이용하라는데, 솔직히 뭐라는지 잘 모르겠어서 대충 옮겨 적기만 했다.
8. Shader
쉐이더는 많은 내용이 나와있지 않다. 나도 쉐이더 자체에 대해 많은걸 알지 못한다. 다만, 단순한 쉐이더를 사용하면 성능을 끌어올릴 수 있다는 정도. 기본 쉐이더에 모바일 항목도 있으니 참고하면 될 듯 하다. 우리에겐 매뉴얼이 있으니까.
내용이 많고 바로 다 이해가 되진 않지만, 당장 보고 적용해서 도움이 될만한 내용도 많았던거 같다. 내 스스로 정리가 필요해서 기록하기도 하지만, 나처럼 모바일 최적화를 고민하는 분들이 같이 힌트를 얻어가도 길게 적은 보람이 있을거 같다.