빙수달 게임 개발 노트

[Unity] 드로우 콜(Draw call)과 배칭(Batching) 본문

Devpedia : Game

[Unity] 드로우 콜(Draw call)과 배칭(Batching)

빙수달 2025. 1. 7. 14:53

1.   드로우 콜(Draw call)

  Draw call이란, CPU가 GPU에게 object를 그리라고 명령하는 과정을 의미한다. 게임  object를 화면에 rendering하려면 우선 oject가 rendering 대상인지 판단한다. 이러한 과정을 culling이라고 한다. 데이터는 데이터 저장장치에 저장된다.(HDD, SSD 등) CPU에도 CPU 메모리가 있고 GPU에도  GPU  메모리가 있다. GPU는 CPU에 의해서  처리되고, GPU가  mesh 를 rendering 할 때 geometry 데이터를 읽어오는 공간이 바로 GPU 메모리이다.  따라서  mesh를 그리기 위해서는 GPU 메모리에 mesh 관련 정보가 있어야 한다.

 

  위의 그림처럼 저장장치에 있는 데이터를 복사하여 CPU 메모리에 데이터를 올린다. 하지만 GPU는 CPU 메모리에 접근할 수 없기에 GPU 메모리에 데이터를  다시  복사해야 한다.  이 과정을 거쳐 GPU 메모리에는 Mesh 정보가 저장 된다. 또한, GPU는 결국  그려야 하는  상태 정보를 담는 테이블이 있는데  테이블을 Render States라고 한다.

  Render States에는 vertex, mesh, shader, texture 등의 상태 정보가 담겨 있다. 이 상태 정보를 CPU는 GPU에게 전달하고 GPU는 렌더 상태 정보를 저장한다. 마지막으로 CPU는 GPU에게 그리라고 명령하는데 이를 DP Call(Draw Primitive Call)이라고 한다. 또한, CPU는 GPU에게 바로 명령을 하지 않고 command buffer라는 곳에 명령 버퍼를 저장한다. 그러면 GPU는 할 일을 처리한 후에 command buffer에서 명령을 순차적으로 가져가서 수행한다.

 

2.   Batching & SetPass

  Unity에서는 드로우 콜을 Batch와 SetPass 두 용어로 나누어 표시한다.

(1) Batching

  Batching은 Draw call은 줄이는 작업을 의미한다. 기본적으로  Draw  call을  발생시킬  수 있는 image, texture, material, shader를 하나로 묶어서 처리하는 작업이다.  또한,  Draw call은 mesh 한  개에  material  한  개면 draw call이  한  개 발생하고,  material이  2개면 두  개 발생한다.

  • Texture, Sprite Atlas

  Image 또는 texture를 하나로 묶어서 처리하여 draw call을 줄인다. Inspector에서 설정이 가능하다. Objects for Packing에서 원하는 스프라이트를 추가할 수 있다. 그 후 Pack Preview 버튼을 누르면 하나의 Texture로 Packing된 결과를 확인할  있다.

 

  • 정적 배칭(Static)

  정적 게임 object의 mesh를 미리 결합한다. Unity는 결합된 데이터를 GPU로 보내지만, 결합 상태인 각 mesh를 개별적으로 rendering한다. Unity는 mesh를 개별적으로 culling할 수 있지만, 각 draw call은 데이터 상태가 전혀 변경되지 않았기 때문에 resource를 더 적게 소모한다. 이는 runtime에 움직이지  않는  구조물 같은  object에 적합한  방식으로, CPU의 부담 을 줄일  있지만, 메모리가 비교적 많이 사용되는 단점이 있다.

- 움직이지 않는 object들에 대해서 사용할  있는 batch 기법이다.

- 정적으로 되어있는 object들의 mesh를 하나로 묶어 작업 하게 된다.

- StaticBatchingUtility.Combine()을 이용해서 스크립트에서 사용할  있다.

- 메모리 성능을 많이 잡아먹을  있기 때문에 상황에 맞게 설계하는 것이 중요하다.

 

  • 다이내믹 배칭(Dynamic)

  CPU에서 mesh vertex를 변환하고 동일한 설정을 공유하는 vertex를 그룹화하여 하나의 draw call로 rendering한다. Vertex는 동일한 수와 타입의 속성을 저장할 경우, 동일한 설정을 공유한다. 즉, Unity 내부적으로 자동으로 수행되는  batching으로  자동으로  batching을 하는 경우와, batching하지 않는 경우 중에서 최적인 사항을 선택하여 자동으로 수행되게 된다.

- 정적 batching과는 반대로 움직이는 object들에 대해서 실시간으로 처리한다.

- Vertex가 많은 mesh는 사용이 불가능하다.

 

(2) Setpass Call

  SetPass는 shader로 인한 rendering pass 수를 의미한다. SetPass에서 알려주는 상태 변경은 shader의 변경 혹은 shader parameter들의 변경이 일어나는 경우, scene object를 redering하는 과정에서 material이 바뀌면 그에 따라 shader 및  parameters가  바뀌고  setpass 카운트가 증가한다. 이 때, 많은 상태 변경이 일어나야하기 때문에 setpass 횟수도 중요하다. 만약 게임이 CPU 바운드이고 GPU에 명령을 보내는 과정, 즉 draw call이 병목이라면 setpass call 횟수를 줄이는게 가장 효율적이다.