드로우콜
드로우 콜 : CPU가 GPU에게 어떤 것을 그리라고 명령하는 것
1. 먼저 상태가 변경됐는지(그려야 하는 상태 정보가 다른지) 확인해서 상태 변경 명령을 내리고
2. 메시를 그리라고 명령함 == DP Call
- CPU가 커맨드 버퍼에 명령을 쌓아놓고 GPU가 가져가는 방식으로 병렬 작업이 진행됨
- CPU 성능에 의존적
배치
배치 : DP Call과 상태 변경들을 합친 넓은 의미의 드로우 콜
Set Pass
Set Pass : 드로우콜이 일어날 때 상태 변경의 발생 여부
- 동일한 머티리얼을 사용한다면 메시의 변경은 포함하지 X
- 쉐이더 변경
배칭
배칭 : 드로우콜을 줄이는 작업
- DP Call, 상태 변경들을 묶음
최적화 우선순위
1. SRP 배처와 Static 배칭
2. GPU 인스턴싱
3. Dynamic 배칭
Static 배칭
스태틱 배칭 : 정적인 오브젝트를 위한 배칭 기법
- Project Settings - Player - Other Settings - Static Batching 체크
- 배칭할 오브젝트에 Batching Static 플래그 체크
Dynamic 배칭
다이나믹 배칭 : 동적으로 움직이는 오브젝트들끼리 배칭 처리를 하는 기법
- 배칭 처리가 런타임상에 이루어지므로 (static이 아닌 오브젝트들의 버텍스를 모아 합침 -> 다이나믹 배칭에 쓰이는 버텍스 버퍼와 인덱스 버퍼에 담음 -> GPU가 그림) 오버헤드가 발생
- Skinned Mesh에는 적용이 불가능
- 900개 이상의 버텍스 속성과 255개 이상의 버텍스를 포함하는 메시에는 적용이 불가능
SRP 배칭
SRP 배칭 : URP, HDRP, SRP에서 사용하는 배칭
- 공통된 쉐이더를 사용하는 한에서 배칭이 이루어짐
- Material이 달라도 됨
- Batching은 줄지 않지만 SetPassCall이 줄어듬
GPU 인스턴싱
GPU 인스턴싱 : 단일 드로우 콜에서 동일한 재질의 메시 사본을 여러 개 렌더링 하는 드로우콜 최적화 기법
- 동일한 메시와 머티리얼을 공유해야함
- 다이나믹 배칭에 비해 런타임 오버헤드가 적음
- 별도의 메시를 생성하지 않고 인스턴싱되는 오브젝트들의 트랜스폼 정보를 버퍼에 담고 GPU가 이것과 원본 메시를 가져다가 한 번에 처리하여 렌더링함
적용
따로 적용
Static 배칭
Dynamic 배칭
- 씬에 버텍스 수가 너무 많아 프레임 디버거 사진으로 대체
SRP 배칭
GPU 인스턴싱
같이 적용
GPU 인스턴싱과 Static 배칭
SRP 배칭과 Static 배칭
결론
=> 프로젝트 상황에 맞게 드로우콜 최적화 기법을 사용하면 될 것 같다.
- 예시 프로젝트는 SRP 배칭과 Static 배칭을 합칠 때 최적화가 제일 잘 되었다.
'유니티 그래픽스 최적화 스타트업' 카테고리의 다른 글
Frame과 모바일 디바이스 (0) | 2023.08.14 |
---|