| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- 스택
- Input Assembler
- c++
- rasterization
- Mipmap
- im뱅크
- priority_queue
- graphics rendering pipeline
- SetPass Call
- 취준
- 포워드 렌더링
- occlusion culling
- 코딩테스트
- Output Merge
- UnReal
- 어레이
- 디퍼드 렌더링
- 이중우선순위큐
- 그래픽스 파이프라인
- bvh
- std::vector
- batches
- Stack
- Fetching
- 데이터분석
- DrawCall
- Tesselation
- 개발자면접
- vertex shader
- 힙
- Today
- Total
평생 배우는 개발자
DrawCall을 줄여야 하는 이유, drawcall,batches,setpass call 본문
서론
게임개발에서 드로우콜을 줄여야하는 것은 개발자의 의무이다. 그렇다면 드로우콜은 무엇이고 왜 줄여야 하며 줄이는 방법에는 무엇이 있을까? 더하여 드로우콜과 batches 그리고 setpass call은 무엇일까?
본론
Draw Call은 CPU가 GPU에게
“이 오브젝트를 이 머티리얼과 셰이더로 렌더링하라”
라고 명령하는 호출 단위입니다.
GPU는 수천 개의 스레드로 병렬 처리가 가능하지만,CPU는 이러한 Draw Call들을 직렬적으로 하나씩 처리해야 합니다.
따라서 Draw Call의 수가 많아지면 CPU가 병목(Bottleneck) 이 되고,결국 프레임 처리 속도가 떨어집니다.
즉, Draw Call을 줄인다는 것은 CPU의 명령 전송 부담을 줄여 최적화를 한다는 의미입니다.
Unity에서는 Batches라는 개념을 볼 수 있습니다.이는 Draw Call과 유사하지만, 약간 더 큰 개념입니다.
OpenGL의 렌더링 과정을 예로 들면 다음과 같습니다.오브젝트를 그리기 위해서는
glBindBuffer(VBO/IBO), glUseProgram(Shader), glBindTexture(Texture)
등의 바인딩(상태 전환) 이 먼저 이루어지고,그 다음 glDraw__() 호출이 수행됩니다.이때 같은 상태(State) 를 공유하는 오브젝트들이 많다면 한 번의 바인딩으로 여러 번의 glDraw__() 호출을 실행할 수 있습니다.
이러한 한 세트의 바인딩과 그 안의 여러 Draw Call 묶음이 Batch입니다.
즉, Draw Call은 glDraw__() 호출 하나하나를 의미하지만, Batch는 그보다 상위의 개념으로,
같은 상태에서 연속으로 처리되는 Draw Call들의 묶음이라고 볼 수 있습니다.
결과적으로, Draw Call의 절대 수보다 Batch의 수를 줄이는 것이 더 직접적인 최적화 효과를 줍니다.
왜냐하면, Batch를 줄인다는 것은 상태 전환(binding) 횟수를 줄인다는 뜻이고, 이 바인딩 과정이 CPU에서 수행되며 비용이 매우 비싸기 때문입니다.
다음으로 SetPass Call은 GPU의 실제 렌더링 파이프라인 상태(머티리얼, 셰이더, 텍스처 등)가 변경될 때마다 발생합니다.
즉, glUseProgram, glBindTexture, glBlendFunc 등의 상태 전환이 일어날 때마다 증가합니다.
SetPass Call은 Batch와 거의 1:1로 대응되며, 최종적으로는 SetPass Call을 줄이는 것이 진정한 의미의 렌더링 최적화입니다.
Draw Call을 줄이는 대표적인 방법으로는 Batching과 GPU Instancing이 있습니다.
- Batching은 여러 오브젝트의 버텍스 데이터를 묶어서 CPU가 한 번에 전달하도록 하여 Draw Call을 줄이는 방법입니다.
(예: Static/Dynamic Batching, SRP Batcher 등) - GPU Instancing은 동일한 머티리얼을 사용하는 오브젝트를 GPU 내부에서 복제하여 렌더링하는 기술입니다.
즉, CPU가 동일한 명령을 여러 번 보내지 않아도 GPU가 병렬적으로 처리합니다.
결론
드로우콜을 줄인다는 것은 단순히 호출 수를 줄인다는 의미가 아니라,
CPU에서 비싼 바인딩(State Change)을 최소화하여 GPU의 병렬 성능을 최대한 활용한다는 뜻입니다.
정확히 말하면, “Draw Call을 줄인다”는 말은 “SetPass Call(상태 변경 수)을 줄인다”와 같은 의미이며,
이는 곧 CPU의 부담을 줄이고 GPU가 쉬지 않고 일하게 만드는 최적화의 핵심입니다.
마무리
위의 내용을 바탕으로 개발자 면접 간
1. Drawcall이 무엇인가요?
2. Drawcall을 왜 줄여야 하나요?
3. 경험해본 게임 프로젝트에서 Drawcall을 줄이기 위해 했던 노력이 있나요?
등에 대한 질문을 생각해 볼 수 있겠다. 스스로에게 질문을 해보고 답해보자.
헷갈리는 부분은 보완하기! 찡긋 O.<
틀린 부분이나 보완해줬으면 하는 내용이 있으면 댓글로 알려주세요! 추가 설명이 필요하신 부분도 댓글로 알려주세요.
어떠한 피드백도 환영입니다. 긴 글 읽어주셔서 감사합니다.
출처 : ChatGPT
'개발면접준비' 카테고리의 다른 글
| 2025 넥토리얼 - 게임 프로그래머 준비(0) (0) | 2025.09.12 |
|---|---|
| NHN 2025 게임공채 I 게임 클라이언트(1) (0) | 2025.09.12 |
| NHN 2025 게임공채 I 게임 클라이언트(0) (1) | 2025.08.23 |
| 2025 메이플 집중채용 - 메이플스토리 pc 게임 프로그래머 채용 후기(1) (3) | 2025.05.24 |
| 2025 메이플 집중채용 - 메이플스토리 pc 게임 프로그래머 채용 후기(0) (2) | 2025.05.23 |