설모의 기록

[Cocos creator] draw call 이란 본문

게임엔진/Cocos creator

[Cocos creator] draw call 이란

HA_Kwon 2018. 1. 22. 18:58

Draw Call 

  게임 엔진의 성능에 대해 공부를 할 때, delta time 과 함께 등장하는게 바로 드로우 콜입니다. 드로우 콜은 말 그대로 그려달라는 요청입니다. 하나의 오브젝트를 화면에 그리기 위해 CPU 가 GPU 에게 "화면에 그려줘~!" 라고 요청하는게 바로 draw call 입니다. 따라서 이미지 1000개를 그리기 위해서는 1000번의 요청이 필요하고 한 프레임안에 그 요청을 수행해야하니 delta time 이 낮아지겠죠? 그렇게 게임이 느려지게 되는 것입니다. 따라서 드로우 콜이 높아질수록 게임의 성능은 낮아질 수밖에 없습니다. 그렇기 때문에 draw call 을 줄이는 작업은 매우 중요합니다.


   이 draw call 을 줄이기 위해 게임엔진들은 batch 기술을 제공합니다. 아래의 예시를 볼까요?

위의 예시를 보시면, batchObject 를 하나 만들고 그 객체의 자식으로 같은 이미지 스프라이트 컴포넌트를 가진 오브젝트들을 생성하는 겁니다. 이렇게 자식들을 가진 batchObejct 를 화면에 그리게되면 batchObject 를 화면에 그리는 것이기 때문에 드로우 콜은 1번이죠. 

batch는  cocos creator 도 마찬가지인데요. cocos creator 는 연속된 요청에서 같은 이미지를 가진 오브젝트가 존재한다면 auto batching 를 이용해 한번의 draw call 로 여러 오브젝트를 한번에 그립니다. 아래 여러 경우의 예제를 살펴보면서 draw call 에 대해 알아보겠습니다.


  우선 저는 Texture packer 프로그램을 이용해 이미지들을 아틀라스로 만들었습니다. 따라서 이미지 구조는 아래와 같습니다.

  dog 이미지 시트와 fox 이미지 아틀라스를 생성해 Texture 폴더에 넣었습니다. 이제 Sprite Node 들을 생성해볼까요?


이렇게 Sprite node 를 추가하면 draw call 은 몇이 나올까요?

정답은 2입니다. "이미지를 4개 그리라고 요청하는데 왜 draw call 이 2지?!" 라고 생각하실 수 있습니다. dog1 과 dog2 / fox1 과 fox2 는 같은 아틀라스에 존재하는 이미지이므로 같은 이미지 파일입니다. 따라서 연속으로 4개의 이미지를 그려달라고 GPU 에게 요청을 하지만, dog 파일 2번, fox 파일 2번을 요청하는 것입니다. 같은 이미지를 연속적으로 요청하면 draw call 은 한번이니까 결국 draw call 은 2가 됩니다. 이해 되시나요? 이제 두 번째 예제를 보겠습니다.


이런 노드 계층구조라면 draw call 은 몇일까요?

정답은 3입니다. 이 예시는 좀 쉽죠? fox1, dog1/dog2, fox2 로 총 3번이 됩니다. dog1 과 dog2 는 같은 텍스처 아틀라스의 이미지이기 때문에 한번의 draw call 로 그려지는 것이죠. 다음 예제를 볼까요?


노드의 계층구조를 보시면 dog1 의 자식으로 fox1 을 옮겼습니다. 이번에는 draw call 이 몇일까요?

정답은 4입니다. "dog1 과 dog2 를 연속적으로 그려달라고 요청했으니까 그것들은 draw call 이 1이 되어야 하는 것 아닌가요?" 라고 말씀하실 수 있습니다. 그러나 그림을 그리는 순서는 깊이 우선으로 한 노드의 자식들을 모두 그려야 다음 노드를 그릴 수 있습니다. 따라서 그림을 그리는 순서는 dog1 -> fox1 -> dog2 -> fox2 로 연속된 같은 이미지 요청이 없기 때문에 draw call 은 4가 되는 것입니다. 개념이 좀 잡히시나요? 다음 예제를 보겠습니다.


이번에는 dog1 자식으로 dog2, fox1 를 생성했습니다. 이렇게 하면 draw call 은 몇일까요?

정답은 2입니다. 그림을 그리는 순서는 dog1 -> dog2 -> fox1 -> fox2 이기 때문에 dog1, dog2 가 한번, fox1, fox2 가 한번의 draw call 을 발생되므로 총 2번의 드로우 콜이 발생합니다. 


이상으로 draw call 에 대해 알아보았습니다.


Comments