Batching이란?
Batching이란 여러 개의 렌더링 요청을 하나로 묶어서 처리하는 기법
→ CPU와 GPU간의 통신 횟수를 줄여 성능을 최적화 하는 기법
왜 Batching이 필요한가
Unity에서 많은 개체를 렌더링 하면 당연하게 성능이 저하됨
- Draw Call : CPU가 GPU에게 “이거 그려줘”라고 명령하는 과정
- Draw Call이 많으면 CPU의 부담이 커짐 → Frame 낮아짐
- Batching을 통해 Draw Call을 줄이면 성능이 향상됨
Draw Call 최적화
Static Batching(정적 배칭)
- 움직이지 않는 Object들을 하나의 메쉬로 결합하여 Draw Call을 줄이는 방식
- GameObject의 Static 옵션을 활성화하면 자동 적용


- 한 번 Batching되면 개별 Object를 이동, 회전, 스케일 조절 불가능
- 개별 오브젝트가 하나의 큰 Mesh로 결합되므로 메모리 사용량 증가 → Memory Overhead
Dynamic Batching(동적 배칭)
- 작은 오브젝트들을 한 번에 묶어 배치하는 방식
- 개별적으로 이동, 회전, 스케일을 조절할 수 있지만 일정 크기 이하(Vertices 300개 이하, Indices 900개 이하)여야 함
- Frame마다 Batching을 계산해줘야 하므로 실시간 처리 부담 증가 → CPU Overhead
SRP Batcher(Scriptable Render Pipeline Batcher)
- SRP Batcher는 Shader 연산을 최적화해서 Draw Call을 줄히는 방식
- Unity의 URP, HDRP에서 지원함
- 기본적으로 GPU Instancing과 함께 사용 가능
- SRP Batcher가 활성화되면 기본 Batching보다 더 빠름
- URP 사용 시 자동 활성화됨
- Shader에서 #pragma multi_compile_instancing 추가
Occlusion Culling
- Camera에 보이지 않는 Object는 Rendering하지 않도록 최적화
- Camera가 가려진 Object는 연산에서 제외됨
- 큰 맵에서 성능 향상에 효과적
LOD(Level Of Detail)
- 거리에 따라 Low-Quality Model을 사용하여 성능 최적화
- 가까이 있는 Object는 고해상도, 멀리 있는 오브젝트는 저해상도
- LOD Group을 활용해서 자동으로 관리 가능
- 삼각형 개수를 줄여 GPU 부하를 낮춤
Frustum Culling
- 카메라 뷰(FOV) 밖의 Object는 렌더링 하지 않음
- Unity에서 자동 지원
- Object가 카메라 시야 밖이면 렌더링 안함
Shader, GPU Optimization
GPU Instancing
- 동일한 Mesh와 Material을 사용하는 Object들을 GPU에서 한 번에 렌더링
- CPU가 아닌 GPU에서 처리하므로 수천 개의 오브젝트도 빠르게 렌더링 가능
- Material이 GPU Instancing을 지원해야 함
Compute Shader 활용(GPU 병렬 연산)
- 복잡한 연산을 CPU가 아닌 GPU에서 병렬 처리하는 Shader
Compute Shader의 필요성
- Compute Shader는 Visual 연산뿐만 아니라, 물리, AI, Particle등 다양한 GPU 연산 수행 가능
- CPU 연산보다 빠름(대량 데이터 병렬 처리)
- Unity에서 ComputeBuffer를 사용해 CPU ↔ GPU 데이터 교환 가능