# 배칭(Batching)?
유니티 최적화 기술 중 배칭(Batching)은 중요하다
특히 모바일이나 저사양 기기를 위한 유니티 게임을 만들 때
필수적으로 이해하고 활용해야 하는 기술이다
배칭은 간단히 말해 CPU가 GPU에 그리기 명령(Draw Call)을
보내는 횟수를 줄여서 렌더링 성능을 최적화하는 기술이다
# 드로우 콜(Draw Call)?
배칭을 이해하려면 먼저 드로우 콜을 알아야 한다
드로우 콜은 CPU가 GPU에게
"이 모델을 이 재질로, 이 위치에 그려라"라고
명령을 내리는 것을 의미한다
CPU는 게임 로직 계산, 물리 연산, 드로우 콜 생성 등의 일을 하고
GPU는 CPU로부터 받은 드로우 콜을 바탕으로 실제로 화면에 이미지를 그린다
문제는 CPU가 드로우 콜을 생성하고 GPU에 보내는 과정이
생각보다 비용이 많이 발생한다
그렇기에 드로우 콜이 너무 많아지면,
CPU가 병목 현상을 일으켜서 GPU가 할 일이 있어도 명령을 받지 못하고
대기하는 상황이 발생한다
이를 CPU Bound라고 부른다
# 배칭(Batching)의 원리
배칭은 이렇게 비싼 드로우 콜의 수를 줄이는 기술이다
여러 개의 오브젝트를 하나의 드로우 콜로 묶어서 GPU에 보내는 것이다
예를 들어, 나무 100그루를 그리는 경우를 생각해 보자
배칭을 안 하면,
나무 1그루당 1번의 드로우 콜로
총 100번의 드로우 콜이 발생한다
배칭을 하면,
나무 100그루를 1번의 드로우 콜로 묶어서 보내기에
총 1번의 드로우 콜이 발생한다
이렇게 드로우 콜 횟수가 줄어들면 CPU의 부담이 줄어들어 게임 성능이 좋아진다
# 유니티의 배칭 종류 및 활용 방법
유니티는 크게 두 가지 종류의 배칭을 제공한다
1. 스태틱 배칭 (Static Batching)
대상:
움직이지 않는(Static) 오브젝트들로,
한 번 배치되면 게임 중 위치, 회전, 크기가 변하지 않는 오브젝트들이다
ex. 건물, 길, 배경 오브젝트, 움직이지 않는 나무 등
원리:
유니티에서 빌드할 때, 동일한 재질(Material)을 사용하는
스태틱 오브젝트들의 메시(Mesh)들을 하나의 큰 메시로 합쳐버립니다
이렇게 합쳐진 메시는 런타임에 하나의 드로우 콜로 그려진다
사용법:
배칭 하려는 오브젝트의 Inspector에서 Static 체크박스를 활성화해야 한다
동일한 재질(Material)을 사용하는 오브젝트들끼리만 배칭이 가능하다
여러 재질을 사용하는 오브젝트는 배칭 되지 않는다
따라서 가능한 한 재질의 수를 줄이는 것이 중요합니다
(ex. 텍스처 아틀라스 사용 등)
물론, 합쳐진 메시를 저장하기 때문에 메모리를 더 많이 사용할 수 있다
2. 다이내믹 배칭 (Dynamic Batching)
대상:
움직이는(Dynamic) 오브젝트들로,
게임 도중에 위치, 회전, 크기가 변하는 오브젝트들이다
ex. 캐릭터, 적, 움직이는 배경 오브젝트 등
원리:
런타임에 유니티가 자동으로 조건을 만족하는 작은 메시들을
동적으로 묶어 하나의 드로우 콜로 처리한다
제약 조건:
오브젝트의 메시 정점(Vertex) 개수가 매우 적어야 한다
유니티 버전에 따라 다르지만 보통 300~900개 미만이어야 한다
동일한 재질(Material)을 사용해야 한다
다른 스케일링(Non-uniform scaling, 즉 x, y, z 스케일이 다른 경우)이 적용되지 않아야 한다
오브젝트가 너무 멀리 떨어져 있지 않아야 한다
다른 셰이더 패스(Shader Pass)를 사용하지 않아야 한다
장점:
개발자가 직접 설정할 필요 없이 유니티가 자동으로 처리해 준다
단점:
조건이 까다로워서 실제로는 생각보다 많은 오브젝트가
다이내믹 배칭의 혜택을 받지 못할 수 있다
스태틱 배칭만큼 효과적이지 않을 때가 많다
# 추가적인 배칭 기술
최근 유니티 버전(특히 URP, HDRP 같은 Scriptable Render Pipeline 사용 시)에는
아래와 같은 더 발전된 배칭 기술도 활용할 수 있다
3. SRP Batcher
대상:
URP/HDRP 프로젝트에서 사용되며, 동일한 셰이더 그래프(Shader Graph)를
사용하는 오브젝트들의 CPU 비용을 줄여준다
원리:
셰이더 코드와 셰이더 속성(Material Property) 데이터들을 효율적으로 GPU에 업로드하여,
드로우 콜 자체의 오버헤드를 줄인다
드로우 콜 횟수를 직접적으로 줄이기보다,
각 드로우 콜에 드는 CPU 비용을 줄여주는 개념이다
사용법:
URP/HDRP 프로젝트 설정에서 SRP Batcher를 활성화하기만 하면 된다
4. GPU Instancing
대상:
동일한 메시와 재질을 사용하지만, 위치, 회전, 색상 등 개별 속성만 다른
수많은 오브젝트를 그릴 때 매우 효과적이다
ex. 수많은 풀, 나무, 파티클 효과 등
원리:
GPU에게 "이 메시를 이 재질로 여러 번 그려라.
각각의 위치/색상 정보는 이 배열에서 가져가라"라고 한 번의 드로우 콜로 명령한다
CPU는 한 번의 드로우 콜만 보내고, GPU가 대량의 복사본을 효율적으로 생성한다
사용법:
재질(Material)의 Inspector에서 Enable GPU Instancing을 체크해야 한다
사용자 정의 셰이더를 사용할 경우에는
셰이더 코드 내부에 GPU 인스턴싱 관련 코드를 추가해야 한다
모든 플랫폼에서 지원하는 것은 아니며,
특정 하드웨어 API(예: DX11, OpenGL Core, Vulkan, Metal)를 필요로 한다
# 배칭 주의점
배칭을 통해 GPU는 성능이 향상되지만
그만큼 CPU를 사용하게 되어서 무조건 좋지는 않다
드로우 콜이 많이 높은 경우 배칭을 테스트해 보는 것이 좋고
CPU의 상태에 따라 선택을 하면 된다
'게임 엔진 - 유니티 > [최적화] 유니티' 카테고리의 다른 글
| [유니티 최적화] Garbage Collector (0) | 2025.06.21 |
|---|---|
| [유니티 최적화] 메시 압축 (0) | 2025.06.21 |
| [유니티 최적화] IL2CPP (0) | 2025.06.21 |