참고
- 드로우 콜 배칭 (Unity 메뉴얼)
- OnGUI, ProfilerRecorder로 런타임 드로우 콜 확인하기
드로우 콜, Batches
아래와 같이 쿼드 5개를 배치하고 게임을 실행한 후, Game Scene에서 Stats을 확인해보자.
유니티는 Draw Call 횟수를 Batches로 알려준다.
Draw Call은 CPU가 GPU에 오브젝트를 그려라고 하는 명령의 호출을 의미한다.
Draw Call 횟수가 많을수록 렌더링 횟수가 많아지므로 성능이 떨어지거나 기기가 빨리 뜨거워진다.
Draw Call을 줄이는 방법은 여러 가지가 있지만 간단히 해결하는 방법은 아래 세 가지가 있다.
- 불필요한 shadow 연산 off 하기
- 움직이지 않는 오브젝트라면 static 처리하기
불필요한 shadow 연산 off 하기
이제 Quad 하나를 disabled 해보자.
Batches가 23 → 19로 변경되었다.
쿼드를 하나만 남기면 Batches는 7이된다.
여기서 Ligiting을 꺼보자.
Directional Light를 disabled하면 Shadow casters가 0이되고 Batches도 7 → 3으로 줄어든다.
라이팅 연산이 없으면 오브젝트 1개당 Batches가 1 늘어나는 것을 알 수 있다.
다시 Directional Light를 enabled로 바꾸고, 쿼드를 하나만 남겨보자.
Light가 on이더라도 Renderer의 Cast Shadows를 Off로 하면 Shadow casters가 줄어들고 Batches도 4가 된다.
현재 유니티 씬에 오브젝트가 그림자를 필요로 하지 않는다면 Cast Shadows를 Off해서 드로우 콜을 줄이는 것이 좋다.
움직이지 않는 오브젝트라면 static 처리하기
다시 쿼드 하나로 돌아가자.
쿼드를 Static으로 체크하고 게임을 실행해보자.
Batches가 변화가 없다.
이때 Mesh Filter에 있는 Mesh가 Quad다.
쿼드 5개를 모두 enabled로 만들고 static을 체크한 후 다시 게임을 실행해보자.
쿼드가 5개이지만 Mesh가 하나로 합쳐졌고, Batches도 여전히 7이다.
유니티에게 오브젝트가 움직이지 않는다(= static)고 알려주는 것으로
유니티가 적절히 Mesh를 합치고 Draw Call을 줄인다.
위의 링크대로 CombineInstance로 만든 오브젝트도 아래와 같이 드로우 콜이 줄었다는 것을 확인할 수 있다.
CombineInstance를 실행할 때는 static을 해제해둬야 한다.
위의 오브젝트는 모두 머테리얼이 동일하고, 동일한 Material을 합치는 것을 Batching(배칭)이라고 한다.
참고로 오브젝트의 Material이 다르다면 아래와 같이 CombineInstance가 적절히 동작하지 않는다.
(왼쪽이 원래 오브젝트, 오른쪽이 메시를 합친 오브젝트)
이 경우는 sharedMaterial을 이용해야 한다. (유니티 메뉴얼 참고)
위의 실행결과는 아래의 unitypackage에서 확인 가능하다.
Unity Plus:
Unity Pro:
Unity 프리미엄 학습:
댓글