1. Batch 란?
1-1. DrawCall과 SetPasscall
- Draw Call : CPU가 GPU에게 오브젝트를 그려달라 요청하는 행위 -> 이때, 큐를 이용해 CPU가 작업을 넣어두면, GPU는 자신의 작업속도에 맞춰서 꺼내서 작업진행.
- SetPass Call: GPU가 실제 DrawCall을 처리하기 전, ShaderPass, Material 및 Blend/Depth/Cull 등의 렌더링 상태를 설정하거나 변경하는 호출 횟수.
- Batch : 동일한 렌더링 상태를 공유하는 오브젝트들을 묶어 처리하는 렌더링 작업 단위로, 배칭을 통해 Draw Call 및 불필요한 SetPass Call을 줄일 수 있음.
-> 우리가 보통 렌더링 최적화를 하기위해선 이 Batch수를 줄여야할 필요ㅇ.
- GPU 입장에서는 SetPassCall -> Draw Call -> GPU 렌더링 순으로 작업을 진행.
1-2. 예시
- 3개의 Object가 같은 Material을 사용하는 경우
A → 빨강 Material
B → 빨강 Material
C → 빨강 Material
SetPass → 빨강 Material/Shader 상태 설정 ← 1
Draw A ← 1
Draw B ← 2
Draw C ← 3
결과: SetPassCall 1/ Draw Call
- 3개의 Object가 각자 다른 Material을 사용하는 경우
A → 빨강 Material
B → 파랑 Material
C → 투명 Material
SetPass → 빨강 설정 ← 1
Draw A ← 1
SetPass → 파랑 설정 ← 2
Draw B ← 2
SetPass → 투명 설정 ← 3
Draw C ← 3
결과: SetPassCall 3/ Draw Call 3
1-3. Batch 적용되는 컴포넌트

- SpriteRenderer
- MeshRenderer
- LineRenderer
- TrailRenderer
- ParticleSystem
2. 실제 예시
2-1. 같은 Mateiral을 사용할 때 얻는 최적화


- 각자 다른 Material를 쓰고 있는 경우 Batches:8/ SetPass Calls:8 인 상황.


- 모두 동일 Material을 사용하도록 구조를 바꾸게 된 경우 Batches:8/ SetPassCalls: 3로 Batches수는 그대로이나 SetPassCalls수가 줄어든 상태.
- SetPassCall 횟수자체를 줄인것도 큰 이익.
3. Dynamic 배칭과 Static 배칭
3-1. Dynamic 배칭
- Dynamic Batching: 런타임에서 조건이 맞으면 자동으로 묶어서 DrawCall을 줄이는 방식.
- 단점으로, CPU 연산 증가.
- 따라서 무조건 해당 설정을 ON하는 것보단, 작은 Mesh가 많고, 서로 Material 등 배칭 조건이 맞는 경우 CPU비용보다 DrawCall 줄이는 효과가 클때 사용하는것이 효과적.

- Dynamic Batching 켜기.

- saved by batching이 5개로 늘고, Batches:3으로 줄어든것을 확인 가능.

- 프레임 디버거로 확인하면 DrawDynamic이라고 표기되며, Draw Call 한번에 해당 오브젝트들이 모두 그려진것을 확인.
- 추가로, 정점 속성을 900개 이상을 가지거나, 225개 이상의 정점을 포함하는 메시에는 적용 불가.

- 2D에서 SpriteRender와 Atlas는 기본적으로 동적 배칭을 사용.


3-2. Static 배칭
- 움직이지 않은 오브젝트들을 묶어서 Draw Call을 줄이는 방식.
- 단점으로, 메모리 사용량 증가가능.


- 정적배칭 또한 Saved by batching:5가 생기며, Baches수는 줄어드나, Transforming이 안되는 상황이 발생.
4. SRP Batcher와 GPU 인스턴싱
4-1. SRP Batcher

- SetPass 및 Draw 준비 과정의 CPU 비용을 줄이는 기술

- URP는 기본적으로 사용하는 상태.

- SRP Batcher를 사용하는 경우, 각자의 Object가 다른 메터리얼을 사용하고 있는 상황임에도 불구하고 SetPass call이 줄어드는 상황을 볼수가 있다.
- 이때 주의점은, 그 각자 다른 메터리얼이 하나의 공통된 Shader를 사용해야한다는 조건이 필요.

- 사용 하는 쉐이더가 SRP Batcher를 호환하는지 확인 필요.
4-2. GPU 인스턴싱

- 동일한 Mesh와 Material을 사용하는 여러 오브젝트를 하나의 Instanced Draw Call로 처리하여 Batch/Draw Call 수를 감소시키는 기법.
-> ex) 나무 Mesh + 나무Material A <-> 집 Mesh + 나무 Material B ---- A와 B는 같은 GPU Instancing으로 묶이지않음.
- SRP Batcher와 동시에 사용 불가능.
- 사용하는 매터리얼의 쉐이더가 SRP Batcher와 호환하지 않는 것이라면 꼭 OFF할필요는 없음.

- 1개만 Batch 되고, 나머지는 모두 Save된 상태를 확인 가능.
- CPU가 하나의 mesh만 읽어서, GPU에 전달하고, GPU는 자기자신에 저장해서 사용.
-> 즉, CPU가 한번의 드로우콜로 동일한 매시와 매터리얼을 가진 여러 오브젝트를 렌더링하도록하는 기법.

- Draw Calls 쪽이 아닌 DrawInstanced Call쪽으로 포함.
- Unity에서는 하나의 Mesh에 256미만의 Vertex를 가지고있다면 비효율적인 퍼포먼스가 나온다고 함.