본문 바로가기
프로그래밍/Unity

BatchRendererGroup(BRG)

by argentdarae 2025. 3. 29.
반응형

BatchRendererGroup(BRG)란?

BatchRendererGroup(BRG)는 Unity의 저수준 렌더링 API로, 수많은 객체의 렌더링 데이터를 GPU에 효율적으로 전달하여 드로우 콜 수를 줄이고 성능을 향상시키는 핵심 시스템이다

 

Unity 6에서는 이 BRG가 더욱 발전하여 GPU Resident Drawer, Entities Graphics, GPU Occlusion Culling 같은 최신 기술들의 기반으로 활용되고 있다

 

레거시 API의 한계점

출처: https://www.youtube.com/watch?v=3mSO1sMdGxM

 

기존 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

Trying out new Unity API: BatchRendererGroup - Blog