유니티 Draw Call이 많아지면 왜 성능이 떨어질까요?
유니티 드로우콜을 줄여야 한다는 이야기는 많이 들어봤지만, 실제로 왜 줄여야 하는지 정확히 이해하지 못한 경우가 많습니다.
이전 글을 통해 유니티 FPS가 떨어지는 이유를 파악했다면, 이제 다음 단계로 넘어갈 수 있습니다.
“그럼 실제로 무엇을 줄여야 하는가?”
많은 분들이 가장 먼저 떠올리는 것이 바로 Draw Call입니다.
“Draw Call을 줄이면 성능이 올라간다”
“Batching을 적용해야 한다”
이런 이야기는 한 번쯤 들어보셨을 겁니다.
하지만 여기서 중요한 질문이 있습니다.
👉 Draw Call은 왜 줄여야 하는가?
이 질문에 답하지 못하면,
Batching을 적용해도 기대한 만큼 성능이 올라가지 않는 경우가 많습니다.
Draw Call이란 무엇인가
Draw Call은 CPU가 GPU에게 보내는 “그려라”라는 명령입니다.
조금 더 풀어서 설명하면 다음과 같습니다.
CPU는 렌더링을 직접 하지 않습니다.
대신 “이 오브젝트를 이 상태로 그려라”라는 명령을 GPU에게 전달합니다.
이때 한 번의 명령을 Draw Call이라고 합니다.
예를 들어, 씬에 오브젝트가 100개 있다면
CPU는 GPU에게 최소 100번의 Draw Call을 보내게 됩니다.
문제는 이 과정이 생각보다 비용이 크다는 점입니다.
👉 Draw Call이 많아질수록 CPU의 부담이 급격히 증가합니다.
왜 Draw Call이 많으면 느려질까
단순히 “명령이 많아서” 느려지는 것이 아닙니다.
각 Draw Call은 다음과 같은 과정을 포함합니다.
- 머티리얼 설정
- 쉐이더 상태 설정
- 렌더링 파이프라인 상태 변경
- GPU로 명령 전달
이 과정은 CPU 입장에서 꽤 비용이 큰 작업입니다.
즉, Draw Call이 많다는 것은 단순히 “그리는 횟수”가 많은 것이 아니라
CPU가 처리해야 할 준비 작업이 많다는 의미입니다.
그래서 CPU Bound 상황에서는 Draw Call 수가 매우 중요한 지표가 됩니다.
Batching이 필요한 이유

👉 Draw Call만 줄이는 것이 아니라, SetPass Call까지 함께 줄이는 것이 핵심입니다.
이 문제를 해결하기 위해 등장한 개념이 바로 Batching입니다.
Batching은 여러 개의 Draw Call을 하나로 묶는 기술입니다.
예를 들어 오브젝트 100개를 각각 그리는 대신,
한 번의 Draw Call로 처리할 수 있다면 CPU 부담이 크게 줄어듭니다.
👉 이것이 바로 Draw Call을 줄이는 핵심 아이디어입니다.
하지만 여기서 중요한 조건이 있습니다.
👉 모든 오브젝트가 무조건 묶일 수 있는 것은 아닙니다.
Batching이 적용되기 위해서는 다음과 같은 조건이 필요합니다.
- 같은 머티리얼 사용
- 같은 쉐이더 사용
- 렌더링 상태가 동일
이 조건이 깨지는 순간, 다시 Draw Call이 분리됩니다.
SetPass Call이란 무엇인가
Draw Call과 함께 반드시 같이 이해해야 하는 개념이 있습니다.
바로 SetPass Call입니다.
SetPass Call은 쉐이더나 머티리얼 상태를 GPU에 설정하는 작업입니다.
쉽게 말하면 다음과 같습니다.
👉 “이제부터 이 방식으로 그려라”라고 GPU에게 알려주는 단계
문제는 이 작업이 Draw Call보다 더 비싼 경우가 많다는 점입니다.
즉, Draw Call이 줄어도
SetPass Call이 많으면 여전히 CPU는 바쁩니다.
Draw Call vs SetPass Call
이 두 개념을 구분하는 것이 매우 중요합니다.
- Draw Call → “그려라”
- SetPass Call → “어떻게 그릴지 설정”
성능 관점에서는 이렇게 이해하시면 됩니다.
👉 SetPass Call 감소가 더 중요하다
왜냐하면 상태 변경 비용이 더 크기 때문입니다.
많이 하는 실수
이 개념을 이해하지 못하면 다음과 같은 실수를 하게 됩니다.
Draw Call만 줄이고 SetPass Call을 고려하지 않는 경우
이 경우 겉으로 보이는 Draw Call 수는 줄었지만,
실제 성능은 크게 개선되지 않을 수 있습니다.
또 하나의 실수는 다음과 같습니다.
GPU Bound 상황에서 Draw Call을 줄이려고 하는 경우
이 경우 CPU의 부담은 줄어들지만,
실제 병목은 GPU이기 때문에 성능 개선 효과는 거의 없습니다.
정리
Draw Call 최적화의 핵심은 단순히 숫자를 줄이는 것이 아닙니다.
👉 CPU의 부담을 줄이는 것입니다.
- Draw Call 감소 → CPU 작업 감소
- Batching → Draw Call 통합
- SetPass Call 감소 → 상태 변경 최소화
이 세 가지를 함께 고려해야 실제 성능 개선으로 이어집니다.
다음 글에서 다룰 내용
다음 글에서는 GPU Bound 상황에서 가장 중요한 개념을 다룹니다.
👉 Overdraw는 왜 성능을 크게 떨어뜨리는가
특히 UI와 투명 오브젝트가 많은 프로젝트라면 반드시 알아야 할 내용입니다.
🎯 한 단계 더 나아가고 싶다면
렌더링 최적화는 단순히 옵션을 조절하는 작업이 아니라,
엔진 내부 동작을 이해하는 과정입니다.
이에 더해 게임 엔진 내부에서 동작하는 여러 시스템을 직접 구현해보면 상용 엔진의 동작 원리를 보다 분명하게 이해할 수 있습니다.
게임 엔진의 동작 원리를 분명하게 이해하고 싶은 분들에게 아래 강의를 추천합니다.
👉C++로 만드는 게임 엔진 프레임워크 (소코반과 슈팅 게임으로 배우는 엔진 구조)