Game Tech Blog

DirectX - Draw Call ( 드로우 콜 ) 본문

미사용 엔진/DirectX

DirectX - Draw Call ( 드로우 콜 )

jonghow 2023. 10. 2. 16:43
반응형

Draw Call (드로우 콜) 이란? 

CPU가 GPU에게 가지고 있는 오브젝트의 정보 기반으로 메쉬를 렌더링하라! 라는 명령을 일컫는다.

 

여기서 오브젝트가 렌더링 되기 위한 정보는 아래와 같다.

1) 메쉬 정보

2) 버텍스 정보

3) 텍스쳐 정보 

4) 이외 다수 정보.

 

CPU의 명령과 렌더링 되기 위한 정보를 기반으로 GPU 는 오브젝트를 그릴 수 있다.

 

어떤 과정을 기반으로 그리는가?

CPU 와 GPU 는 긴밀한 협업관계를 가지고 있다. 먼저, GPU가 메쉬를 렌더링 하기위해선 그릴 버텍스 데이터, 텍스쳐 머티리얼, 쉐이더 정보들이 있어야한다. 이들을 미리 CPU가 로딩하여, GPU 메모리에 올려놓고, 그 재료들을 이용하여 GPU가 렌더링 연산을 수행한다.

 

중요한 것은 CPU에서 로딩한 데이터들은 복사과정을 거쳐 GPU 데이터를 올린다. (GPU에서 CPU메모리를 바로 접근하지 않기때문.)

 

생각해보면, 매 프레임마다 로드와 릴리즈 과정을 한다는것이 매우 비효율 적으로, 인게임 상에선 보통 씬 로딩 과정에서 메모리에 올려놓고, 다른 씬으로 이동하거나, 게임을 종료할때 메모리를 해제시켜준다.

 

오브젝트의 렌더링 정보?

보통 프레임 워크의 Render Loop 에서는 오브젝트 렌더링 시점에서 GPU에 어떤 텍스쳐,버텍스,쉐이더를 기반으로 그려야할지 데이터를 전달해야 한다. A 는 a 텍스쳐, a 버텍스, a 쉐이더 이렇게 있을때, 1개씩 이동하면 총 3번의 전달과정을 해야한다. 매우 비효율적이다.

이런 문제를 해결하기위해, 오브젝트는 위 정보들을 테이블로 묶어서 전달하는데, 이를 Render State ( 렌더 상태 ) 라고 한다. 이 테이블에 전달되는 것은 데이터가 저장되어 있는 주소로 원하는 데이터를 접근해서 찾아올 수 있다.

 

Draw Primitive Call 이란? 

위 오브젝트의 렌더링 정보가 Render State 라는 설명을 했다.

Render State의 데이터를 변경하는 명령을 보내면, GPU는 당연히 가지고 있던 데이터를 덮어쓰고 새로운 정보로 갱신한다.

그리고 그 후, CPU는 새롭게 갱신했으니, 그 정보를 기반으로 다시그려! 라는 명령을 보낸다. 

이를 Draw Primitive Call , 즉, DP Call 이라고 한다. 

물론, 변경될 필요가 없는 오브젝트의 경우, Render State 를 다시 보낼 필요도, 다시 그릴 필요도 없다. 

정확한 조건은 찾아봐야겠으나, 시스템 내에서 판단하는 것으로 이해하고 있다.

이런 형태의 Loop 에서 계속 반복하여 새로운 정보로 갱신하고 그걸 기반하여 새롭게 그린다. 

이를 우리는 Draw Call 이라고 하고, 즉, Render State + DP Call => Draw Call 이라고 말할 수 있다.

 

CPU가 GPU에게 렌더링 하라고 명령을 보내는 조건?

매 프레임 unity 는 LifeCycle을 통해 UpdateLoop, Lateupdate 등이 호출되는 것으로 알고있어, 당연히 매 프레임 Rendering 과정이 수행되는 줄 알고 있긴한데, 의문인 내용이 있어서 ChatGPT를 검색해보았다.

내가 의문인 내용은 이거였다.

" CPU는 GPU에게 Render State를 넘겨주면서 DP Call 커맨드를 주고 화면을 그리라고 할텐데, 그렇다면 아무런 변화도 없을때 이 과정은 수행할까? 만약 수행하지 않고 DrawCall을 하지않는다면, CPU가 판단하는 판단기준은 뭘까?" 였다.

알려준 결과는 이랬다.

" CPU가 화면을 갱신할 필요가 없다고 판단하더라도 GPU에게 명령을 무조건 내리는 것은 아닙니다.

CPU는 각 프레임에서 화면을 그리기 위해 GPU에게 렌더링 명령을 내립니다. 그러나 CPU는 각 프레임마다 화면을 갱신할 필요가 없다고 판단할 수 있으며, 이 경우 CPU는 화면 갱신을 생략하고 GPU에게 새로운 렌더링 상태를 전달하지 않을 수 있습니다.

 

따라서 CPU는 필요한 경우에만 GPU에게 렌더링 명령을 내리고, 화면 갱신이 필요하지 않은 경우에는 렌더링 명령을 내리지 않습니다."

 

그렇다면 판단 기준은?

" 1. 화면에 표시되는 객체의 상태 변화: 화면에 표시되는 객체가 변하지 않거나, 변화가 미미한 경우 CPU는 GPU에게 새로운 드로우콜을 내릴 필요가 없을 수 있습니다.

 

2. 애플리케이션의 로직: 애플리케이션의 상태나 게임의 진행 상황 등에 따라 CPU는 드로우콜을 내릴지 여부를 결정할 수 있습니다. 예를 들어, 플레이어가 움직이지 않는다면 새로운 드로우콜을 내릴 필요가 없을 수 있습니다.

 

3. 성능 최적화: CPU는 GPU에게 드로우콜을 내리는 데에도 일정한 비용이 들기 때문에, 성능을 최적화하기 위해 CPU는 불필요한 드로우콜을 최소화하려고 할 것입니다. 이를 위해 CPU는 화면 갱신이 필요한지 여부를 신중하게 판단할 것입니다.

 

4. 외부 입력: 사용자의 입력이나 외부 이벤트에 따라 화면이 갱신되어야 하는 경우 CPU는 GPU에게 드로우콜을 내릴 것입니다. 사용자의 조작에 따라 게임 화면이 변경되는 등의 상황에서는 CPU가 적절한 드로우콜을 내려야 합니다."

 

결론, 메쉬 데이터들의 변화된 값이 없거나, 미미한 경우, 게임의 상황에따라, 성능을 최적화 하기위해 등등이 있다고 한다.

 

 

 

반응형
Comments