안녕하세요!
최적화 특집 시리즈 2편입니다. 오늘 주제는 Draw Call 줄이기예요.
1편에서 Profiler 켜고 Rendering 탭 봤을 때 Batches 수치가 높게 나왔던 분들, 이번 편이 딱 맞는 내용이에요.
다들 게임을 만들다 보면 한 번쯤은 Batches가 높게나오고 그걸 줄여야 최적화가 된다라는 말을 들어보셨을거에요!
저도 그래서 최적화를 공부할 때 Draw Call, Batches, Batching을 알게되고 그때부터 이해가 편해지더라구요.
그럼 개념부터 알아보겠습니다!!
1. Draw Call이 뭔데 왜 문제야?
Draw Call은 CPU가 GPU한테 "이거 그려줘" 하고 명령을 보내는 것 자체예요.
문제는 이 명령 하나하나가 CPU 오버헤드를 발생시킨다는 거예요. 오브젝트 하나 그릴 때마다 CPU가 머티리얼, 셰이더, 텍스처 정보를 GPU에 넘겨야 하거든요. 오브젝트 100개면 명령도 100번, 1000개면 1000번이에요.
특히 모바일에서는 이 비용이 PC보다 훨씬 커요. 그래서 Batching이 필요한 거예요.
Batching은 간단히 말하면 "여러 오브젝트를 하나로 묶어서 Draw Call 횟수 자체를 줄이는 것" 이에요.
2. Static Batching
움직이지 않는 오브젝트들을 에디터에서 미리 하나로 합쳐두는 방식이에요.
배경, 건물, 바닥처럼 절대 안 움직이는 오브젝트에 적용해요. 런타임에 연산이 없어서 Batching 방식 중 성능이 가장 좋아요.
적용 방법은 두 가지입니다.
조건이 하나 있어요. 같은 머티리얼을 쓰는 오브젝트끼리만 묶여요. 머티리얼이 다르면 Batching이 안 됩니다.
단점으로는, 합쳐진 메시 데이터를 메모리에 보관하기 때문에 메모리 사용량이 늘어납니다.
오브젝투가 너무 많으면 오히려 역효과가 날 수 있어서 적용 전후로 Profiler Memory 탭에서 수치 꼭 확인해보세요!
3. SRP Batcher (Unity 6 기준 핵심)
Unity 6에서는 SRP Batcher가 기본으로 활성화되어 있어요.
기존 Batching이 "오브젝트를 하나로 합쳐서 Draw Call 수를 줄이는 것"이라면, SRP Batcher는 조금 달라요. Draw Call 수 자체를 줄이는 게 아니라 Draw Call 사이에 발생하는 GPU 셋업 비용을 줄이는 방식이에요.
쉽게 말하면 이래요.
기존 방식: 오브젝트마다 셰이더 정보를 매번 GPU에 올림
SRP Batcher: 셰이더 정보를 GPU 메모리에 캐싱해두고 재사용
그래서 Profiler Rendering 탭에서 Batches 수치는 그대로인데 실제 렌더링 시간이 줄어드는 현상이 나타나요. Batches 숫자만 보고 "왜 안 줄어들지?" 싶었던 분들은 이 때문일 수 있어요.
활성화 확인 방법
Project Settings → Graphics → SRP Batcher 체크 여부 확인
Unity 6 URP 기준으로는 기본 활성화되어 있어요. 꺼져 있으면 켜두는 게 좋아요.
SRP Batcher가 동작하려면 셰이더가 호환되어야 해요. URP/HDRP 기본 셰이더는 대부분 호환되는데, 커스텀 셰이더를 쓴다면 호환 여부를 Frame Debugger에서 확인할 수 있어요.
4. Batching이 안 되는 이유 확인하는 법
Batching 설정을 했는데도 Draw Call이 안 줄어드는 경우가 있어요. 이럴 때 Frame Debugger로 원인을 바로 찾을 수 있어요.
왼쪽 목록에서 드로우 콜을 하나씩 클릭하면 오른쪽에 왜 이전 드로우 콜과 Batch가 안 됐는지 이유가 텍스트로 나와요.
자주 나오는 이유들이에요.
- "Different materials" → 머티리얼이 달라서
- "Renderer is not in static batch" → Static 체크 안 해서
- "GameObject is not active" → 비활성 오브젝트
이유 확인하고 하나씩 잡으면 Batches 수치가 눈에 띄게 줄어요.
5. Sprite Atlas는 왜 같이 쓰나
Batching 조건이 같은 머티리얼이라고 했잖아요. 2D 게임에서 스프라이트를 각각 따로 임포트하면 스프라이트마다 머티리얼이 달라져서 Batching이 깨져요.
Sprite Atlas로 스프라이트를 한 장의 텍스처로 묶으면 머티리얼이 하나로 통일돼서 Batching이 자연스럽게 걸려요. 아틀라스 관련 자세한 내용은 이전 포스팅에 정리해뒀으니 참고해주세요.
마무리
Static Batching이랑 SRP Batcher만 챙겨도 웬만한 프로젝트는 커버가 되는데, 상황에 따라 이런 방식도 있어요.
나무, 돌, 적처럼 완전히 동일한 오브젝트가 씬에 수십 개 이상 배치된다면 → GPU Instancing. 머티리얼에서 Enable GPU Instancing 체크 하나로 적용돼요.
움직이는 단순한 오브젝트(파티클, 간단한 2D 스프라이트)가 많다면 → Dynamic Batching. 근데 버텍스 300 이하 제한이 있고 Unity 6에서는 SRP Batcher가 대부분 대체하기 때문에, 실전에서 의도적으로 쓸 일은 많지 않아요.
다음 편은 초보 때 몰라서 가장 많이 저지르는 실수들, String GC Alloc / Update() 남용 / GetComponent 반복 호출을 한 번에 정리할게요!
'유니티' 카테고리의 다른 글
| 게임 최적화(3) - 초보들이 놓치기 쉬운 최적화! (0) | 2026.06.10 |
|---|---|
| 게임 최적화(1) - Unity Profiler 읽는 법! (0) | 2026.05.21 |
| 최적화 - 유니티 최적화 시리즈 시작! (0) | 2026.05.08 |
| Unity 기능 리뷰 - Avatar Mask + Animator Layer (1) | 2026.04.16 |
| 디자인 패턴 - 서비스 로케이터 패턴(Service Locator Pattern) (0) | 2026.04.08 |
