BatchRendererGroup(BRG)란?
BatchRendererGroup(BRG)는 Unity의 저수준 렌더링 API로, 수많은 객체의 렌더링 데이터를 GPU에 효율적으로 전달하여 드로우 콜 수를 줄이고 성능을 향상시키는 핵심 시스템이다
Unity 6에서는 이 BRG가 더욱 발전하여 GPU Resident Drawer, Entities Graphics, GPU Occlusion Culling 같은 최신 기술들의 기반으로 활용되고 있다
레거시 API의 한계점
기존 Unity 렌더링은 MeshRenderer, SkinnedMeshRenderer 등 GameObject 중심의 구조로, 매 프레임마다 CPU가
- 렌더링 대상 필터링
- 메쉬/머티리얼/트랜스폼 구성
- 드로우 콜 전송
을 수행한다. 이 방식은 수백~수천 개의 오브젝트가 등장하는 오픈월드 씬이나 RTS 장르에서는 렌더 스레드가 병목이 되기 쉽다
또한 Unity 6의 BRG와 비교했을 때 아래와 같은 근본적인 한계가 있다
GC(가비지 컬렉션) 발생
- 인스턴스 위치를 전달할 때 Matrix4x4[] 같은 관리되는 배열을 매번 넘겨야 함
- 이로 인해 매 프레임 가비지 수집이 발생할 수 있고, 모바일/저사양 기기에서 잦은 GC 스파이크를 유발함
불필요한 역행렬 계산
- Unity는 obj2world의 역행렬(world2obj)도 함께 계산해서 넘기는데, 이건 실제 셰이더에서 필요하지 않은 경우에도 CPU가 매번 계산한다 (예: URP의 Unlit 셰이더)
- 결과적으로 불필요한 CPU 오버헤드가 생김
인스턴스 속성 확장성 부족
- 인스턴스당 color, float, texture index 등 커스텀 속성을 추가하려면 셰이더를 직접 수정하거나 Shader Graph로 별도 구현해야 함
- 고급 머티리얼 오버라이드 기능이 없다
GPU 메모리 비상주 방식
- DrawMeshInstanced는 프레임마다 모든 데이터를 GPU에 업로드해야 함
- Persistent GPU 저장 불가능, 즉 데이터 재사용이 어려워 대규모 오브젝트가 많은 씬에서는 성능 병목 발생
BRG 사용의 이점
BRG는 렌더링 데이터를 GPU에 “상주시킴”으로써, CPU-RenderThread 병목을 완화하고 GPU에 직접적으로 대규모 데이터를 전달할 수 있도록 해준다
GPU Persistent Buffer 활용
메쉬, 머티리얼, 트랜스폼 데이터를 GPU에 장기 저장하는 기능이다
오브젝트 데이터가 GPU에 상주하므로, 프레임마다 다시 보낼 필요 없다
간접 드로우 + Compute Culling + 자동 LOD
GPU가 직접 가시성 판단, LOD 전환, Sorting 등을 수행한다
인스턴스당 머티리얼 속성 유연 지원 (Entities Graphics 한정)
인스턴스별 색상, 마스크, 효과 등 세밀한 오버라이드가 가능하다
다만 인스턴스당 머티리얼 속성 지원은 BRG 자체가 아닌, Entities Graphics 같은 상위 시스템에서 제공된다
BRG로 직접 구현하려면 별도의 프로퍼티 버퍼 구성과 셰이더 확장이 필요하다
Reference
Unity 6 Fantasy Kingdom으로 알아보는 4가지 그래픽스 신기능 - Youtube
BatchRendererGroup API in URP - Unity Doc
BatchRendererGroup sample: Achieve high frame rate even on budget devices - Unity Tech Blog
'프로그래밍 > Unity' 카테고리의 다른 글
Unity 6 에디터 주요 변경점 (0) | 2025.03.31 |
---|---|
Unity R3 라이브러리 import(설치) 방법 (0) | 2025.03.31 |
Unity 6 GPU Occlusion Culling (0) | 2025.03.29 |
Unity 6 GPU Resident Drawer란? (0) | 2025.03.29 |
Unity 6 STP(Spatial-Temporal Post-processing)란? (0) | 2025.03.29 |