그래픽스, 게임 수학

드로우 콜(Draw Call)

Jcon 2025. 6. 4. 00:32

드로우 콜이란?

CPU가 GPU에게 특정 오브젝트를 그리게 하기 위한 단일 명령이다. 한 프레임에 여러번 호출 될 수 있으며, 호출 수가 많아질 수록 CPU와 GPU의 오버헤드가 커지기 때문에, 호출 횟수를 줄여 드로우 콜 비용을 낮추는 것이 게임 최적화의 핵심이다. 

 

 왜 여러 번 나눠서 보내야 할까?

왜 드로우콜은 여러번 호출되는 걸까? 

GPU는 수많은 정점과 픽셀 연산을 위해 대량 병렬 처리에 특화되어있다. 때문에 GPU는 효율적인 병렬 처리를 위한 GPU만의 특별한 작업 단위가 있는데 그것이 Render State이다. 

RenderState?

GPU가 효율적인 병렬 처리를 수행하기 위하여는, GPU 고유의 작업 단위, 즉 규칙의 집합이 요구된다. 이를 바로 **렌더 상태(Render State)**라 칭한다. 렌더 상태란 특정 메시(Mesh)가 화면상에 어떠한 방식으로 표현될지를 규정하는 모든 설정 값의 총체라 할 수 있다.

여기에는 다음과 같은 정보들이 포함된다.
  • 사용할 셰이더(Shader)
  • 텍스처(Texture)
  • 블렌딩(Blending) 모드
  • 뎁스 테스트(Depth Test) 방식
  • 기타 다양한 렌더링 관련 설정들 (컬링 방식, 스텐실 테스트 등)

 

드로우 콜을 다시 설명하자면, 특정 메쉬를 특정 RenderState로 그려줘! 가 되는것이다. 

이는 한 세트의 규칙(셰이더, 머터리얼.. )을 고정해 놓고, 그 상태가 유지되는 동안 데이터(메쉬)를 폭주시켜야 하드웨어 자원을 100% 가까이 활용할 수 있기 때문이다. 

게임에선 한 장면을 그리기 위해 다양한 리소스와 셰이더가 사용되고 때문에 불가피하게 한 프레임에 여러 드로우 콜을 요청하게 되는것이다. 

 

*드로우콜이 호출되기 이전에 렌더링에 필요한 리소스(메쉬, 텍스쳐..) 와 RenderState는 이미 VRAM에 올라간 상태이다. 때문에 드로우콜에서 하는 명령은 VRAM에 이미 올라가 있는 메쉬와 RenderState를 지정하여 렌더링을 명령할 뿐이다. 

 

 왜 느릴까?

CPU가 드로우콜을 명령하면, GPU는 CPU가 지정한 RenderState로 메쉬를 그리기 위해 GPU상태를 변경한다. 이 과정에서 GPU의 캐시 무효화되거나, 파이프라인 버블이 발생하면서 연산을 하는 그 자체보다 더 많은 비용을 발생시킬 수 있다. 


Unity의 Batch & Set pass call 

  • Batch란?
    • 유니티에서 사용하는 드로우 콜을 포함하여 렌더링을 위해 GPU에 요청한 명령의 단위이다. 최종적으로 한 프레임에 발생하는 Batch수는 드로우 콜 + Set Pass Call이 된다. 
    • 한 장면의 렌더링을 위해선 드로우 콜 뿐 아니라, 셰이더 상수 변경, 텍스쳐 변경 등.. Render State변경을 위한 명령도 요청하게 된다. 이는 드로우콜 보다 많은 비용이 들기 때문에 이런 명령들을 Set Pass Call이라는 이름으로 따로 분류한다. 
      유니티 Game윈도우의 Stats에서 Batch수를 확인할 수 있다.

관련 용어

  • Pipeline: 드로우콜 이후 GPU에서 메쉬와 RenderState 데이터를 가져와 픽셀로 변환하는 과정 
  • Command Buffer: GPU가 수행해야 할 명령들의 버퍼이다. CPU는 GPU로 직접 명령을 전달하는게 아닌 Command Buffer에 명령을 쌓아놓아 CPU와 GPU가 서로 독립적으로 작동할 수 있도록 한다. 
  • Streaming Multiprocessor: GPU코어에 명령을 할당하는 프로세서, 여러개의 코어가 Streaming Multiprocessor에 할당 될 수 있고, Streaming Multiprocessor는 1개의 RenderState를 가진다. GPU는 여러개의 Streaming Multiprocessor를 가지고 있기 때문에 여러 파이프라인을 병렬적으로 처리할 수 있다.

참고 링크

https://simonschreibt.de/gat/renderhell-book2/ 

 

Render Hell – Book II | Simonschreibt.

Most of the constructive feedback I received about this article was “Nice explanation, but your pipeline is 6 years old!”. I wasn’t sure what that exactly meant until Christoph Kubisch joined my fight in the Render Hell. He is a Developer Technology

simonschreibt.de

https://www.youtube.com/watch?v=r_eatgPFQYg&t=7766s

https://docs.unity3d.com/kr/current/Manual/GPUInstancing.html

 

GPU 인스턴싱 - Unity 매뉴얼

GPU 인스턴싱은 단일 드로우 콜에서 동일한 재질의 메시 사본을 여러 개 렌더링하는 드로우 콜 최적화 방법입니다. 각 메시 사본을 인스턴스라고 합니다. 씬 내에 여러 번 나타나는 나무나 덤불

docs.unity3d.com

https://www.youtube.com/watch?v=w14yjBlfNeQ

https://www.youtube.com/watch?v=UsyvT36vqpU