게임 개발 공부/Unity

유니티 드로우콜

CalebHong 2022. 7. 8. 12:12

Draw Call

- CPU가 GPU에게 연산 명령을 던져주는 것을 의미

- CPU와 GPU 는 병렬 관계로 처리하며, CPU가 GPU에게 명령을 던져줌으로 GPU가 랜더링과 같은 처리를 시작함

- CPU는 명령은 던져주고 나서 다시 자기 일을 처리하기 시작

- 만약 또 다시 CPU가 GPU에게 명령을 던져주려 할 때 GPU가 이전 처리가 완료되지 않았다면, CPU는 처리를 기다리게 됨

- CPU와 GPU는 서로 다른 프로세스 유닛이기에 통신 비용이 발생

- 랜더링하기 전에 CPU에서 수많은 정보를 설정해줘야 함

  ex) Vertex Buffer, Alpha Blending, Use Z-Buffer, Trasnform, Texture, Shader, Change States, Draw 등

 

Command Buffer

- CPU가 GPU에게 명령을 던져줄 때, 직접적으로 전달되지 않고 Command Buffer(일종의 큐)를 통해서 전달

- Set Shader, Set VBO, Set Texture, Draw 등과 같은 Command들이 버퍼에 채워지게 되면 GPU는 순서대로 명령들을 처리

- Open GL 과 같은 API가 다양한 GPU들이 알아들을 수 있도록 Command를 변경해줌

 

게임뷰에서의 Stats 정보

- CPU 입장에서는 Vertex가 많든 적든, 텍스쳐가 크든 작든 드로우콜 비용은 동일

- Draw Call = Set VB/IB(Mesh) + Set Transform(Shader Constant) + (Set Shader + Set Texture 0~7 + Set Blending + Set Z enable + ...)→ SetPass Call(Material & Shader)

- 동일한 Material을 사용한다면 SetPass Calls은 1이 됨

  ex) 다른 Mesh를 사용하는 오브젝트가 10개 있지만 동일한 Material을 사용한다면 SetPass Calls는 1이 됨

 

Batch & Batching

- Batch = Draw Call + Setting Shader + Setting Blending + Setting Texture + Setting Vertex Buffer + ...

- Batching = 1 batch for many objects(하나의 드로우콜로 수많은 오브젝트를 그리도록 하는 기법)

- 배칭에서 가장 중요한 것은 동일한 Material을 사용하는 것

- 이를 위해 Texture Atlas를 사용하여 다양한 오브젝트를 동일한 Material을 사용함

- 그 외 Static Batching을 통해 메모리를 소모하여 씬 로딩 시 정보 구축

- Dynamic Batching(실시간 정보 구축)도 있지만 다양한 제약사항이 있음(Skinned Mesh 사용 불가, Vertex 300 이상의 Mesh 사용 불가)

- 동일한 Material을 사용하더라도 하나의 Batch가 소요되지 않을 수 있음(거리에 따른 구분, 라이트맵 수, Reflection Probe 등의 이유로)

- 최적화를 위해 모듈(조립식) 방식으로 모델링을 하여 동일한 Material을 사용하는 것을 권장

 

- 쉐이더에서 Multi-pass로 그리게 되면 드로우콜이 증가하게 됨