본문 바로가기
Unity/Basic

드로우 콜(Draw call)과 배칭(Batching) 간단 정리

by Blemish 2022. 7. 14.
  • 드로우 콜(Draw call)과 배칭(Batching)을 이해한다.

 

드로우 콜

드로우 콜이란 CPU가 GPU에게 오브젝트를 그리라고 명령하는 것을 의미한다.

 

CPU가 GPU에게 오브젝트를 그리라고 명령하는 과정

Data는 Data 저장 장치에 저장된다.(HDD, SSD 등) CPU에도 CPU Memory가 있고 GPU에도 GPU Memory가 있다. (모바일에서는 물리적으로 나눠지지 않고 논리적으로 나눠서 사용한다.)

GPU는 CPU에 의해서 처리되고 GPU가 Mesh를 렌더링 할 때 지오메트리 데이터를 읽어오는 공간이 바로 GPU Memory이다. 따라서 Mesh를 그리기 위해서는 GPU Memory에 Mesh 관련 정보가 있어야 한다.

 

위의 그림처럼 저장장치에 있는 데이터를 복사하여 CPU Memory에 데이터를 올린다. 하지만 GPU는 CPU Memory에 접근할 수 없기 때문에 GPU Memory에 데이터를 다시 복사한다. 이 과정을 거쳐 GPU Memory에는 메쉬 정보가 저장된다.

또한 GPU는 결국 그려야하는 상태 정보를 담는 테이블이 있는데 이 테이블을 렌더 상태 테이블이라고 한다. 렌더 상태 테이블에는 버텍스, 메쉬, 쉐이더 등의 상태 정보가 담겨 있다.

이 상태 정보를 CPU는 GPU에게 전달하고 GPU는 렌더 상태 정보를 저장한다. 마지막으로 CPU는 GPU에게 그리라고 명령하는데 이를 DP Call이라고 한다.

 

또한 CPU는 GPU에게 바로 명령을 하지 않고 Command 버퍼라는 곳에 명령 버퍼를 저장한다. 그러면 GPU는 할 일을 처리한 후에 Command 버퍼에서 명령을 순차적으로 가져가서 수행한다. (이때 FIFO 구조로 데이터를 불러온다)

 

 

배칭

배칭은 드로우 콜은 줄이는 작업을 의미한다.

기본적으로 드로우 콜을 발생시킬 수 있는 이미지, 텍스쳐, 메테리얼, 쉐이더를 하나로 묶어서(공유) 처리하는 작업 한다.

또한 드로우 콜은 메쉬 한 개에 메테리얼 한 개이면 드로우 콜이 한 개 발생한다. 메테리얼이 2 개이면 두 개 발생.

  • 텍스쳐, 스프라이트 아틀라스
    • 이미지 또는 텍스쳐를 하나로 묶어서 처리하여 드로우 콜을 줄인다.
  • 정적 배칭(Static)
    • 움직이지 않는 오브젝트들에 대해서 사용할 수 있는 배치 기법이다.
    • 인스펙터 상의 static을 클릭하면 사용할 수 있다.
    • Static으로 되어있는 오브젝트들의 메쉬를 하나로 묶어서 작업을 하게 된다.
    • StaticBatchingUtility.Combine()을 이용해서 스크립트에서 사용할 수 있다.
    • 메모리 성능을 많이 잡아먹을 수 있기 때문에 상황에 맞게 설계하는 것이 중요하다.
  • 다이내믹 배칭(Dynamic)
    • 정적 배칭과는 반대로 움직이는 오브젝트들에 대해서 실시간으로 처리한다.
    • Skinned Mesh는 사용이 불가능하다.
    • 버텍스가 많은 메쉬는 사용이 불가능

Batches와 Set pass Call

  • 유니티 stats에서 확인할 수 있다.
  • Batches는 DP call과 상태 변경을 합친 넓은 의미의 드로우 콜이다.
  • Set pass call은 드로우 콜로 인한 상태 변경 횟수를 의미한다.(쉐이더로 인한 렌더링 패스 횟수)
  • 드로우 콜에 의한 병목은 set pass call 수를 줄이는 게 가장 효율이 좋다.

 

 

댓글