midas+son의 크리에이티브(creative) 이야기

드로우 콜(Draw call) 이란 렌더링을 위한 그리기 요청으로 CPU의 성능을 많이 잡아 먹는다.

드로우 콜에 대해서 많은 최적화 방법이 있는데

이 글에서는 간단하고 중요도가 큰 4가지만 알아 보겠다.


1. 정적(Static) 배칭

Inspector의 오브젝트 이름 우측 부근에 Static 버튼이 있는데

이 버튼을 적용하면 이 오브젝트는 정적으로 선언된 것이 된다.

하지만 이것만 가지고 드로우 콜을 줄였구나 생가하면 안되고 조건을 맞게 써야한다.

그 조건은 정적이라는 말과 같이 움직이면 안된다.

position, rotate, scale 모두 변화가 없어야 한다.

그리고 메테리얼이 바뀌면 안된다. 동일한 오브젝트는 같은 메테리얼을 사용하여야 한다.

이 조건이 맞춰지고 설정을 해주어야지 드로우 콜이 늘어 나지 않는다.

하지만 이 방법에는 단점이 있다.

그것은 정적 배칭된 객체들은 메모리 사용이 계속 유지되므로 자원 낭비가 심하다는 것이다.

작은 메모리를 가진 모바일에선 그 양에 따라 튕기는 위험성도 가지고 있다.

즉 메모리와 렌더링 성능의 저울질을 잘 할 줄 알아야 한다.


2. 라이트맵 처리

조명에 따라서 렌더링할 때마다 매번 계산을 해준다.

다이렉트x를 할 때에도 주의사항에 있었지만

조명이 많으면 그만큼 있어보이지만 FPS가 급격히 낮아진다.

게임이 잘돌아가지 않는 다는 것이다.

그래서 해당 빛에 대한 값을 게임중에 계산하는 것이 아니라 

게임 빌드 단계에서 정해버리는 것이다.

그러면 게임중에 따로 연산을 하지 않으므로 있어보인다.

하지만 좀 어색해지는 감도 없지않아 생겨버리게 된다.


3.메테리얼 통합

아틀라스(atlras)라고 전문 용어가 있는 듯하다.

여러개의 텍스쳐 였던 것을 하나의 텍스쳐로 통합을 하는 것이라고 생각하면 된다.

통합된 텍스쳐에서 uv좌표값으로 짤라 사용하는 것이다.

여러개의 텍스쳐를 불러 처리하는 것보다 

하나의 텍스쳐를 불러 처리하는 게

드로우 콜에는 좋은 듯 하다.

기본적으로 유니티에서 Sprite packer로 여러개의 텍스쳐를 스프라이트화 시킬 수 있고

NGUI를 사용하면 Atlras Maker로 아틀라스를 만들어 사용할 수 있다.


4.오클루전 컬링(Occlusion Culling)

벽이 있고 벽 뒤에 오브젝트가 있는데 카메라는 벽을 정면으로 바라보고 있다.

게임 씬 에서는 뒤에 있는 오브젝트가 안그려지지만

내부적으로는 그려지고 있다.

안보이는데 처리를 한다.

그것이 비효율적이기에 생긴 기법이 오클루전 컬링이다.

유니티에서는 옵션으로 처리할 수 있다.

프러스텀컬링(Frustum Culling)이랑 헷살리면 안되는데 

프러스텀 컬링은 카메라 영역 외부에 있는 오브젝트들을 그리지 않는 것이다.

오클루전 컬링(Occlusion Culling)은 카메라 영역 내부에 있는 오브젝트 중에 

다른 오브젝트가 덮어씌워 안보이게 되는 것을 미리 렌더링 처리를 안한다는 것이다.

테스트 해보니 살짝 보일 부분도 처리를 안한다거나 하는 부족한 부분이 

조금씩 눈에 띄기는 하지만 잘 사용해보자.