드로우콜

드로우 콜 : 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 배칭을 합칠 때 최적화가 제일 잘 되었다.

+ Recent posts