[유니티 TIPS] 유니티 최적화를 위한 필수 기본기! Batching 방법 소개
💡 드로우 콜과 배칭
🐱 드로우 콜
- CPU : 디지털 콘텐츠를 구성하는 게임 오브젝트나 데이터를 읽는 역할
- GPU : 데이터를 토대로 콘텐츠를 그리는 역할
- CPU는 GPU에게 읽어들인 데이터를 그리는 명령을 내림
→ 드로우 콜
🐰 Set Pass Call
- 커맨드 버퍼 : CPU가 GPU에게 명령을 내릴 때 따라오는 데이터들
- 다양한 정보들의 버퍼들이 포함
- Set Pass : 머테리얼, 셰이더 등을 묶어놓은 그룹
- Set Pass Call : Set Pass를 전달하는 명령
🦊 배치
- 드로우 콜 뿐만 아니라 그래픽을 구성하는 상태 데이터들도 함께 GPU에게 넘기는 것
- 배치 수가 많을 수록 부하가 심해짐
- 배치 수를 줄이는 것 → 최적화
- 배치에 해당되는 컴포넌트
- Sprite Renderer
- Mesh Renderer
- Line Renderer
- Trail Renderer
- Particle System
🐹 Dynamic Batching
- 활성화 방법
- Preferences - Core Render Pipeline - Additional Properties를 All Visible로 체크
- Project Settings - Quality - Render Pipeline Asset에서 현재 사용하는 렌더 파이프라인 에셋 확인 가능
- Render Pipeline Asset - 마우스 우클릭 - Show Additional Properties로 숨겨진 속성 확인할 수 있음
→ Dynamic Batching 활성화
- 동일한 재질을 사용하는 메시는 버텍스의 정보를 CPU가 모은 뒤 버텍스 버퍼에 담음
- 정점 속성을 900개 이상 가지거나 225개 이상의 정점을 포함하는 메시에는 적용 불가능
🦝 2D의 배칭
- Sprite Renderer는 기본으로 동적 배칭 대상
- Sprite Atlas로 편리하게 배칭 가능
🐶 Static Batching
- Project Settings - Player - Other에서 Static Batching 옵션 활성화 확인
- 정적으로 올릴 오브젝트를 선택한 뒤, Insepctor 창에서 오브젝트 명 옆에 있는 Static 메뉴 체크 → Batching Static을 선택하면 정적 배칭 대상 오브젝트가 됨
- 여러 메시들의 정점을 하나로 통합하면서 정적인 오브젝트가 되므로 트랜스포밍이 불가능
- 정적으로 체크되면 내부에서 하나의 메시로 통합되면서 올라가므로 메모리가 많이 필요
🐸 SRP Batching
- Project Settings - Quality - Render Pipeline Asset
- Render Pipeline Asset - 마우스 우클릭 - Show Additional Properties - SRP Batcher
- URP와 HDRP는 기본적으로 체크되어 있음
- Batches는 줄어들지 않지만 SetPass call은 줄어듦
→ 다른 머테리얼을 사용해도 SetPass call이 줄어든다!
→ 다른 머테리얼이라도 하나의 셰이더를 사용해야 한다는 조건이 있음
- 셰이더가 SRP Batcher와 호환되는지는 인스펙터 상에서 확인 가능
🦁 GPU Instancing
- Render Pipeline Asset - SRP Batcher 옵션 비활성화
- Material - Advanced Options - Enable GPU Instancing 활성화
- CPU가 하나의 메시만 데이터를 읽어서 GPU에게 넘김
→ GPU는 자기 자신의 메모리에 저장
→ GPU는 내부에서 위치 정보만 가지고 동일한 메시를 계속 그려나가게 됨
- 요즘은 그래픽 카드의 성능이 많이 좋아졌기 때문에 이런 방식으로 GPU에게 일을 넘기기도 함
- 그렇다고 무수히 많은 오브젝트들이 단 하나의 배치에 포함되는 것은 아님
- SRP Batcher와 함께 사용 불가능
- GPU Instancing을 사용하면 Frame Debugger의 RenderLoop 항목에서 Instance로 표시됨
- DrawInstanced Call로 따로 체크 됨
- Unity에서는 하나의 메시에 256개 미만의 버텍스를 가지고 있다면 비효율적인 퍼포먼스가 나옴
끄으읏