drawcall (드로우콜) 개념

개념정리 2018. 3. 27. 23:01

참고자료 : 유니티 최적화 배칭과 드로우콜 http://mentum.tistory.com/53

              drawcall에 대하여 http://daniel9811.tistory.com/15

             andwhy님 댓글 http://www.devkorea.co.kr/bbs/board.php?bo_table=m03_qna&wr_id=18881


드로우콜(Draw Call)


 - CPU가 GPU에게 어떠한 물체를 그리라고 요청하는 것 각각 마테리얼당 화면에 한번씩 그리게 됨

화면에 plane(1) 을 하나 만들고 마테리얼(a)을 적용시키면 드로우콜은 1이 된다

다른 plane(2)을 만들고 같은 마테리얼(a) 을 적용하면 드로우콜은 그대로 1 이 되는데

 왜냐하면 "같은" 마테리얼이기때문에 한번에 그릴수 있다

새로 만든 plane(2)을 다른 마테리얼(b)로 만든다면 마테리얼이 2개 생겼기 때문에 DrawCall이 2가 된다

그래서 화면상에 객체에 쓰인 마테리얼수가 적으면 적을수록 드로우콜이 줄어들게 된다

그리고 새로 또 plane(3)을 만들고 처음 만든 plane(1)과 같은 마테리얼(a)을 적용시키면

마테리얼은 2개가 쓰였으니 드로우콜이 2가 된다

그런데, plane1, plane2, plane3 을 차례대로 z값으로 정렬시켜서 살짝 겹치게 두면 사용된 마테리얼은 2개이지만 드로우콜은 3개가 된다.

plane1에사용된 마테리얼(a)를 그린뒤, 그위에 plane2에 사용된 마테리얼(b)를 그리고, 다시 plane3에 사용된 마테리얼(a)를 그리면

총 3번 으로 drawcall이 올라간다 

 A를 그리고 그위에 B를 그리고 그위에 다시 A그리는 명령이 가기때문이다



- 드로우콜이 많을수록 material을 gpu로 전송하는 수가 많아지기때문에 과부하가걸려 렌더링이 느려진다 따라서 그 값이 적을수록 가벼운 게임이라고 할 수 있으며, 기기의 성능에 따라서 특정 갯수를 넘어가면 프레임 저하가 나타난다


- 모바일의 경우 100개정도를 상한선으로 잡는다고 보면 된다. (VR은 당연히 두 번 그리니까 절반 이하)


- 일반적으로 오브젝트를 그릴 때, 오브젝트단위로 한 개씩 증가, 그 외에도 쉐이더에 따라서 추가로 증가할 수 있음.


- 드로우콜을 줄이는 방법은 ? 

1. 스프라이트들을 스프라이트시트에 모두모으면 단한번의 드로우콜로 모든스프라이트들을 렌더링할수있다,


2.최대한 같은 텍스쳐를 사용하는 오브젝트끼리 메테리얼을 공유해 사용하고

여의치 않을땐 1024 4장을 사용하는것보다 2048 한장이 좋다
하지만 오브젝트 하나를 그리는데 2048을 불러오는 것보다는 최대한 줄이는게 좋다
화면 구성에 따라 합칠만한 것들은 최대한 합지고 합치는 것은 텍스쳐를 합쳐서 제작하는 방식도 있고 
유니티플러그인을 이용해도 된다. 상황에 맞게 적절히 필요한 방법을 선택하여 사용한다.


- 그렇다면 드로우콜이 이렇게 중요하다면, 모든 배경을 하나로 합쳐서 내보내는게 제일 좋은것인가?


아니다. 하나의 통메쉬라면 화면에 배경중 극히 일부분만이 보일 경우에도 전체를 무조건 그리게 된다. 

하지만 모듈화를 했을 경우에는 프러스텀 컬링과 오클루전 컬링을 통해 일부 메쉬를 그리지 않는다.

그렇다고 굉장히 세분화해서 나누면 합치는 과정에 코스트가 든다. 적정한 선에서 시야각에 들어오는 구역별로 나누는 것이 중요하다.