자세히보기

공부 나눔 (Sharing Study)/Unity만

[Unity] 드로우콜과 배칭

윤스톤 2023. 9. 11. 10:00

* 이 게시글은 ⌜유니티 그래픽스 최적화 스타트업⌟ 서적으로 공부한 내용을 개인적으로 정리한 것입니다.

 

 

[드로우콜]

: CPU가 GPU에게 렌더링하라고 명령을 보내는 것

 

오브젝트를 렌더링하려면 매번 렌더 상태 정보들을 변경해주어야 함  렌더 상태 변경

메시를 그리라는 명령 → DP Call 명령

 

왼쪽 사진처럼 명령을 바로 보내는 게 아니라 버퍼에 명령을 쌓아두고,

GPU가 작업이 끝나면 다음 할 일을 가져가는 식으로 작업함 → 병령 작업 가능

출처: Unity Korea 유튜브

커맨드 버퍼(Command Buffer)에 각종 상태 변경 명령들과 DP Call 명령을 쌓아두어 순차적으로 수행

 

[드로우콜 발생 조건]

: 기본 적으로 오브젝트 하나에 메시 1개, 머티리얼 1개라면 드로우콜이 1번 발생

→ 즉, Batch가 1

 

1. 메시가 여러 개인 경우

    오브젝트가 하나로 보이더라도 여러 메시로 이루어진 경우가 있음

    한 오브젝트에 메시가 10개라면 오브젝트에 씬에 10개 나오는 경우, 100개의 드로우콜 발생

 

2. 머티리얼이 여러 개인 경우

    한 오브젝트에 여러 머티리얼을 사용하는 경우가 있음, 이 또한 머티리얼 개수만큼 드로우콜 발생

 

3. 쉐이더에 의한 경우

    멀티패스로 두 번 이상 렌더링을 거치기도 함 (ex. 외곽선이 포함된 카툰 쉐이더)

 

여러 이유에 의해 드로우콜 발생이 많아질 수도 있으므로 유의해야 함

수많음 상태 변경들을 포함하기 때문에 드로우콜의 비용을 개당 단언하기도 어려움

 

[Batch & SetPass]

Batch : DP Call과 상태 변경들을 합친 넓은 의미의 드로우콜

SetPass :  드로우콜이 일어날 때 상태 변경의 발생 여부

(Batch 10번 발생 + SetPass 1번 발생 = 쉐이더의 변경 X, 최소한의 상태 변경만)

 

[배칭]

: 다른 오브젝트/메시를 사용하더라도 같은 머티리얼을 사용하는 것

하나의 텍스처에 여러 오브젝트에 필요한 그림을 그려 공용으로 사용

(ex. 아틀라스, 스프라이트 시트 등) (주의: 해상도 문제를 고려해야 함!)

반응형