[Unity3D] 드로우 콜(Draw Call)?

Draw call




‘Draw Call’ 이 뭔가요?


Scene에 있는 Vertex들을 그리기위해 CPU가 GPU에 보내는 요청이지요. 요청을 보낼 때마다 DrawCall이 추가됩니다.


카메라를 통해 한 프레임의 화면을 만들어 내는 동안

1개의 셰이더 패스, 1개의 Material로 오브젝트를 1번 그리는 작업의 단위입니다.


같은 Shader, 같은 Material을 갖는 여러 개의 오브젝트는 1번의 Draw Call로 작업합니다.


예를들어,

화면에 Cube_1, Cube_2를 만듭니다.


Cube_1Material_1을 적용시키죠. Draw Call은 1입니다.

Cube_2Material_2를 적용시키면? Draw Call은 2입니다.


Draw Call이 하나 더 추가됐다니!

Cube_2Material_1을 적용합니다. Draw Call은 1이됩니다.



Material을 공유하지 않는 2 개의 오브젝트들을 함께 결합하는 것은 

성능상 아무런 개선을 주지 않는다는 것을 명심해주세요.


Draw Call수를 줄이는 일이 최적화에서 가장 중요한 요소입니다.




Unity에서 Draw Call은 어떻게 보나요?

Draw Call 확인.PNG

<Game View>에서 상단에 Stats라는 버튼 클릭 후 Draw Call 확인.

그외에 FPS, 버텍스 수, 사용한 텍스쳐량, 화면크기 등 확인가능합니다.  





Draw Call을 어떻게 줄이나요?


유니티에서 제공을하는 배칭(Batching)기술을 사용하는거지요.

배칭 기술에는 정적배칭(Static Batching), 동적 배칭 (Dynamic Batching)2개가 있습니다. 이게 무엇인지는 나중에 이야기하죠. Draw Call을 줄이는 방법부터 볼게요.

먼저 아래 항목을 봐주세요.


1. 가능한 많은 오브젝트를 1개의 Material(1장의 텍스쳐)로 묶어야 합니다.

2. 정적배칭(Static Batching), 동적 배칭 (Dynamic Batching) 기능을 켜라. (기본으로 설정되어있음)

메뉴 Edit> Project Settings > Player  


Dynamic Batching.PNG





'배칭(Batching)'이라니요?


자동적으로 DrawCall을 줄여주는 기술이고, CPU가 GPU에 렌더링 요청을 할 때 

데이터 처리 작업을 한꺼번에 해줘서 GPU의 부담을 줄이게 해주는 것입니다.

2개가 있는데 정적배칭, 동적배칭이 있습니다.


이 2개를 켜두면 모든 오브젝트를 공유된 Material 단위로 묶습니다.

(스크립트에서 수정할 때는 materil 멤버변수 대신 sharedMaterial 멤버를 사용합니다!)




1. 동적 배칭

    • 버텍스 300개 이상인 오브젝트는 안하는게 좋다.

    • Material을 기준으로 Scene에 보이는 오브젝트들을 그룹으로 묶어 분류한다.


2. 정적 배칭(Static Batching)

    • 배칭을 위한 300개의 버텍스 상한선이 없다.

    • 동적 배칭과 유사하지만 배칭하려는 오브젝트를 움직일 수 없다.

    • 움직이지 않는 오브젝트는 Static을 체크한다. (static으로 설정된 GameObject에서 동일한 재질을 사용하는 물체가 있는 경우 자동으로 통합)



Static 설정.PNG