드로우 콜(draw call), 배치(batch), set pass call, GPU Instancing

참고서적 : 유니티 그래픽스 최적화 스타트업 

 

 

최적화를 하다보면

드로우콜(draw call), 배치(batch), 셋 패스 콜(set pass call) 등의 용어를 접하게 된다.

 

 

드로우콜(draw call)

 - 오브젝트가 실제 화면에 렌더링 되려면 CPU가 가지고 있는 정보들이 GPU에 전달 되어야한다.

 - 이러한 정보들을 전달한 뒤, CPU가 GPU에 렌더링하라고 명령을 보내는 것을 드로우 콜이라 한다.

- 오브젝트의 메시 정보
- 텍스쳐 정보
- 쉐이더 정보
- 위치, 스케일 등 트랜스폼 정보
- 기타 등등..

 

 

렌더링 과정

 - Storage(HDD, SSD)에 담긴 데이터를 CPU가 읽어 들이고, 파싱하여 GPU에 해당 정보들을 복사한다.

 - 매 프레임 메모리에 불러오는 과정을 거친다면 과부하가 심해지니, 로딩 시점에 메모리에 데이터를 올려두고 적절한 시점에 메모리를 해제한다.

 - 그려야하는 오브젝트의 정보들을 담고있는 Render State 테이블을 토대로 GPU는 메시를 그린다.

 - 이러한 렌더 상태명령들을 보낸 후, CPU는 마지막으로 GPU에게 메시를 그리라는 명령을 보낸다. (DP Call)

 - 이제 다른 오브젝트를 그리기 위해 렌더 상태 정보를 업데이트 해야한다. 

 

 

DP Call

 - '그리라는 명령을 하는 것' 만을 의미한다.

 - 렌더 상태 변경 명령 + DP Call 까지 포함한 모두를 드로우 콜이라고 한다.

 

 

드로우 콜 발생 조건

 - 메시가 1개, 머테리얼이 1개라면 드로우콜이 1개이다. (Batch 1)

 - (배칭없이) 같은 머테리얼을 공유하는 메시가 10개라면 10개의 드로우콜이 발생한다.

   (하지만, 다른 머테리얼을 사용하는 경우와 성능에 미치는 영향은 다르다!)

 - 메시 한개에 멀티 머테리얼을 사용한경우, 머테리얼 갯수만큼 드로우콜이 발생한다.

 

 

배치(Batch)

 - Batch는 DP Call과 상태 변경들을 합친 넓은 의미의 드로우콜이다.

 

 

SetPass

 - 드로우 콜이 일어날 때 상태 변경 발생 여부, 쉐이더로 인한 렌더링 패스 수.

 - 쉐이더 혹은 쉐이더의 파라미터들이 변경이 일어날 경우 SetPass카운터가 증가한다.

 - 같은 쉐이더를 사용할 경우 Batch는 여러번 일어날 때 SetPass는 한번만 일어날 수 있다. 

 - Batch가 동일하게 10번 발생하더라도 SetPass가 1번 일어난 경우와 10번 일어난 경우는 필요한 성능이 다르다.

 - 때문에 드로우콜은 하나의 지표일 뿐이지 성능에 비례한 절대적인 수치는 아니다.

 

 - 서로 다른 메시들이 동일한 머테리얼을 사용하는 경우 -> batch 10 / SetPass 1

 

 

배칭(Batching)

 - 동일한 머테리얼 인스턴스를 사용하는 메시들을 묶어서 한번에 그린다면, 드로우콜을 통합할 수 있다.

 

 

스태틱 배칭(Static Batching)

 - CPU에서 지오메트리 정보를 연산해서 로딩 타임에서 별도의 메시로 합친다.

 - 오브젝트를 합쳐서 내부적으로는 하나의 거대한 오브젝트로 저장하기 때문에, 여러개의 메시를 합친만큼 추가 메모리가 필요하다.

 - 스태틱 배칭 상태에서도 원래의 오브젝트를 기준으로 컬링이 일어난다.

 

 

다이나믹 배칭(Dynamic Batching)

 - CPU에서 지오메트리 정보를 연산해서 런타임에서 별도의 메시로 합친다.

 - 런타임에서 매 프레임마다 버텍스 연산을 수행하기 때문에 오버헤드가 발생한다.

 - 특정 정점 갯수이하(현재는 300개) 제한 조건이 있다.

 - SkinnedMesh는 불가능하다.

 

 

GPU 인스턴싱(GPU Instancing)

 - 동일한 메시의 복사본을 만들어서 드로우콜을 줄인다.

 - 다이나믹 배칭과 스태틱 배칭에 비해 런타임 오버헤드가 적다.

 - 별도의 메시를 생성하지않음.

 - 원본 메시의 버텍스 갯수 제한은 없으나 SkinnedMesh는 불가능하다.

 - OpenGL ES 3.0 이상이나 Vulkan, Metal에서만 가능하다.

 

 

댓글

Designed by JB FACTORY