Cocos Creator

드로우 콜(Draw Call)

밀하우스 마나스톰 2022. 11. 1. 18:53

1. 드로우 콜(Draw Call)

 

유니티와 코코스 크리에이터 같은 상용 엔진에 동일하게 존재하는 개념이다.

 

매 프레임마다 캔버스를 클리어하고 구성 요소들을 새로 그리기 위해, CPU가 GPU에게 보내는 요청을 Draw Call이라 할 수 있다.

 

한 프레임 안에 모든 Draw Call을 처리해야 하므로, Draw Call이 높아서 한 프레임의 길이가 길어지면

 

이는 곧 프레임 저하로 이어지게 된다.

 

코코스 크리에이터에서는 런타임 중에 FPS나 Draw Call을 확인할 수 있도록 지원해주고 있다.

 

 

 

2. 배칭(Batching)

 

비어있는 캔버스의 경우 기본적으로 1의 Draw Call을 차지한다.

 

오브젝트가 하나씩 추가될 때마다 Draw Call이 +1 증가한 것을 확인할 수 있다.

 

정확히 따지면 항상 그렇지는 않다.

 

- 오브젝트가 1개여도, 10개여도, 100개여도 동일한 Draw Call을 증가시키도록 할 수 있다.

- 오브젝트 하나가 무조건 Draw Call을 1 만큼 증가시키는 것은 아니다. 오브젝트의 구조에 따라 다르다.

 

왜냐면 배칭(Batching) 이라는 개념이 존재하기 때문이다.

 

 

위를 보면 오브젝트는 3개인데 Draw Call은 3이 아닌 1만 증가한 것을 볼 수 있다.

 

왜냐면 위 보석 아이콘들은 사실은 동일한 하나의 이미지(아틀라스)를 원 출처로 하기 때문이다.

 

 

위 상황에서는 Draw Call이 4가 찍힌다.

 

보석 아이콘들이 있는 A 아틀라스를 사용해서 이미지를 출력하다가

 

보물상자 아이콘이 있는 B 아틀라스로 바꾸면서 Draw Call +1이 되고, 다시 A 아틀라스로 바꾸면서 +1이 추가된 것이다.

 

이처럼 Draw Call을 줄이는 제1원칙은 동일한 아틀라스를 사용하는 오브젝트를 최대한 연속적으로 배치하는 것이다.

 

그리고 이것을 배칭을 유지한다고 표현한다.

 

 

 

3. 그 외 Draw Call을 증가시키는 요인들

 

연속되지 않은 아틀라스 참조 외에도 Draw Call을 증가시키는 요인들이 있다.

 

 

(1) Sprite Blending 옵션

가운데 있는 보석 스프라이트의 Blending 옵션에서 디폴트인 SRC_ALPHA가 아닌 DST_ALPHA로 설정했더니

 

마치 중간 보석이 다른 아틀라스에 있는 것처럼 배칭이 깨지고 Draw Call이 추가로 +2 오른 것을 볼 수 있다.

 

 

 

(2) Particle

Draw Call 1을 차지하는 파티클 하나를 보석들 중간에 놓았다.

 

파티클의 머테리얼이 사용하는 텍스쳐 이미지가 보석 아틀라스와 동일한 아틀라스에 있는 게 아니라면

 

동일한 원리로 배칭이 깨져 Draw Call이 +2 추가된다.

 

 

(3) Mask

이번엔 보석들 사이에 아무런 의미 없는 Mask 컴포넌트를 추가했더니 Draw Call이 추가로 +3 오른 것을 확인할 수 있다.

 

실제로 Mask 컴포넌트가 붙은 노드는 아무런 이미지가 없더라도 그 자체만으로 2의 Draw Call을 차지한다.

 

그리고 위처럼 동일한 아틀라스를 사용하는 이미지들의 연속 배치 중간에 Mask가 들어가게되면 배칭이 깨져 더 많은 Draw Call이 추가된다.

 

Mask가 이렇게 Draw Call을 차지하는 이유에 대해서는 구글링하면, 코코스 커뮤니티에서 불만 섞인 글들만 몇 개 나올 뿐이다.

 

 

(4) Font

 

폰트 역시 System Font를 사용하면 노드 하나당 1의 Draw Call이 증가하며 배칭을 깨트릴 수 있다.