드로우 콜(Draw Call)
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이 증가하며 배칭을 깨트릴 수 있다.