[Unity3D] 배칭 & 드로우콜


1. 드로우 콜(Draw Call)

- CPU가 GPU에게 어떠한 물체를 그리라고 요청하는 것.

- 드로우 콜의 개수가 적을수록 가벼운 게임이라 할 수 있다. 기기의 성능에 따라 특정 개수를 넘어가면 프레임 저하가 나타난다.

- 모바일의 경우 100개정도를 상한선으로 잡고있다. (VR은 절반 이하다.)

- 일반적으로 오브젝트를 그릴 때, 오브젝트 단위로 한 개씩 증가한다. 그 외에도 쉐이더에 따라서 추가로 증가 할 수 있다.



2. 배치(Batches)

- Draw Call과 혼용하여 사용하지만, 사실 드로우 콜을 포함하는 상위 개념이다.

- Draw Call + Set VB/IB + Set Transform + Set Pass Call 


※ Set Pass Call = Set Shader + Set Texture 0 ~ 7 + Set Blending + Set Z enable . . .



※ 배치 개수는 어떻게 결정되는가?


1. 매쉬의 개수 * 라이트의 개수 + 재질의 개수 - 동적 배칭으로 절약된 개수.

2. 파티클은 Material이나 Mesh에 관계없이 개당 1개로 계산된다. (만약, 자식으로 달려있는게 있다면 자식 하나당 1개씩.)



3. Set Pass Call


마테리얼과 쉐이더와 관련된 것에 대한 배치를 말한다.


ex) 마테리얼을 공유하여 사용하는 오브젝트가 1개 있다고 하자.

이때, Batch : 10개, Set Pass Call : 1개

총 Batch : 11개.


ex) 마테리얼이나 쉐이더를 공유하지 않고 따로 사용하는 오브젝트 10개.

이때, Batch : 10개, Set Pass Call : 10개

총 Batch : 20개


이러한 이유 때문에 아틀라스를 활용하여 여러 오브젝트들을 한 개의 Material로 묶어서 Set Pass Call을 줄이는 것이 중요하다.



4. 배칭(Batching)


복수의 드로우 콜을 하나의 드로우 콜로 묶어서 처리하는 작업이다.



※ 동적 배칭 (Dynamic Batching)

 - 동일한 마테리얼을 공유하고, 특정 조건들을 만족했을 때, 유니티에서 자동적으로 일어나는 배칭을 말한다.

 - 정적 배칭에 비해서 조건도 까다롭고 눈에띄는 효율이 아니므로 사실 크게 신경쓰지 않아도 되는 부분이다.

 - 동일한 모델의 모양일 필요가 없다.

 - 큰 효율을 보이는 곳은 파티클과 메쉬쪽이다.


*특정 조건


1. -버텍스 개수가 총 900개 이하의 메쉬만 적용가능.

   - 쉐이더가 정점 위치와 법선이나 다른 UV정보를 사용하면 300이하.

   - 정점위치, 법선, UV0, UV1, 탄젠ㅌ트까지 사용하면 180이하.

   - 해당 제한 값을 넘으면 배칭을 안하는 편이 이득이다.


2. 오브젝트가 Mirror의 Transform 값을 가지고 있으면 함께 배칭 되지 않는다. ex) 스케일 +1, -1

3. 마테리얼의 인스턴스가 다를경우(동일한 마테리얼일 경우도.) 배칭이 이루어 지지 않는다.

4. 동적으로 라이트 매핑된 오브젝트가 동일한 라이트 맵의 위치가 아닌 한 배칭이 이루어 지지 않는다.

5. 멀티 패스 쉐이더는 배칭이 이루어 지지 않는다. ex) 카룬 쉐이더의 아웃라인.

6. Skinned Mesh 사용불가.

7. 리얼타임 쉐도우의 영향을 받는 오브젝트는 배칭이 이루어지지 않는다. (Receive Shadow를 체크 했을 때)



※ 정적 배칭(Static Batching)

 

동일한 마테리얼을 공유하고, 움직이지 않는 오브젝트가 인스펙터창에서 Static을 체크해줄 경우 일어나는 배칭.


- 메쉬를 강제적으로 합쳐서 넘져누는 방식이기 때문에 메모리에 부담을 준다.

너무 규모가 크다면 렌더링 쪽을 희생시키는게 나을 수도 있다.

- 눈에 띄는 효과가 나오기 때문에 CPU파워를 줄일 필요가 있을 경우 꼭 정적 배칭을 사용해야 한다.



※ 드로우 콜이 중요하다면, 모든 배경을 하나로 합쳐 내보내는게 이득일까?


아니다. 배경 중 극히 일부분만이 보일 경우에도 전체를 무조건 그리게 된다.

하지만 모듈화 했을 경우에는 오클루전 컬링과 프러스텀 컬링을 통해 일부 메쉬를 그리지 않게 할 수 있다.

그렇다고 매우 세분화해서 나누면 합치는 과정에서 코스트가 많이 발생하기 때문에 적정한 선에서 시야각에 들어오는

구역별로 나누는 것이 중요하다.