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를 변경해줌
- 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로 그리게 되면 드로우콜이 증가하게 됨
'게임 개발 공부 > Unity' 카테고리의 다른 글
LayerMask를 이용한 Layer 비교(feat.충돌 처리) (0) | 2024.05.09 |
---|---|
Unity Script에서 HEX(Hexadecimal) 값으로 Color 변환하는 법 (1) | 2024.01.28 |
New InputSystem 에서 마우스 스크롤(휠) 값으로 카메라 줌 만들기 (0) | 2022.02.20 |
Cinemachine Free Look Camera 민감도 조절 (0) | 2022.02.20 |
Command Pattern (0) | 2022.02.08 |