드로우콜이란(Draw Call in Unity Game Engine?)


* 유니티 퍼포먼스 개념 참고
- 때깔에 과한 욕심 => Texture Size를 크게 써서 가용 메모리가 줄어드는 동시에 GPU-CPU간 Bandwidth 병목 발생.
- 많은 Polygon => Frame Rate이 떨어짐
- 많은 Shader => Fill Rate이 바닥
>> 이 모든 것의 위에 게임 알고리즘과 로직을 엉망으로 만들면 게임이 사망하는 경우 발생

- Transparency나 CutOff를 과하게 사용하진 않았나,
- Culling을 어떻게 했는가,
- Mipmap을 적절하게 잘 썻나,
- glReadPixels(), glCopyTexImage(), glTexSubImage() 같은 퍼포먼스를 잡아먹는 대형 API들을 마구 쓰진 않았는가?,
- Texture Compression Type은 적절했으며, Draw 호출 시엔 VBO를 썼는가?
- LOD는 적절했으며 쉐이더에 너무 많은 Pass를 때려가며 OverDraw를 하진 않았나
>> 게임을 만들면서 Performance에 영향을 미치는 Factor들은 하나의 게임 속에 다양하게 존재한다. Draw Call이 Performance의 모든 것이라고 생각하면 오산이다. 결국 CPU, GPU, Memory, Bandwidth, Shader, GC Call 등 각각의 체크 포인트에서 Bottleneck을 찾아서 해결해 주는 것이 퍼포먼스 최적화의 첫 걸음이다.
>> Draw Call은 그  퍼포먼스에 영향을 미치는 녀석들 중 렌더링 영역에서 크리티컬한 녀석이다.



* 유니티에서 드로우 콜 확인(batches)






* 드로우 콜(Draw Call) 개념


그래서 OpenGL에서는 Immediate 모드로 작은 Triangle들을 산발적으로 그려내는 코드들을, Triangle Strip으로 묶어서 Vertex의 갯수를 줄이거나, Display List, Standard Vertex Arrays, VBO로 변경해서 한번에 그려주면 Performance가 확 올라간다.

그런데 한번에 묶어 그려주기 위해서는 다음의 세가지 조건이 필요하다.

1) 동일한 Triangle Format
2) 동일한 Shader
3) 동일한 GL State

이런 Draw Call을 줄이기 위해서 Triangle들을 묶는 노력들은 여러가지로 할 수 있으나, 대표적인 것이 Texture Atlas이다. Texture Atlas를 사용하면 각각 호출하던 Draw Call을 뭉쳐서 한번에 Triangle 호출로 변경할 수 있어서 결과적으로 Draw Call을 줄일 수 있다.



게임을 만들 때 이 Draw Call을 잘 잡는 전략을 초기부터 차근차근 해나가야 한다. 배경과 캐릭터, UI 그리고 Effect에 각각 적절한 Draw Call 갯수를 할당하고 작업자들이 그 기준을 지키게 하는 것도 중요하다. 일반적으로 모바일에서는 100 Draw Call을 넘으면 무거운 게임이라고 봐야할 것이다. 마구 진행된 프로젝트의 게임 퍼포먼스 작업 진행 중에 최대 피해자는 게임 Graphic Quality이다.




- 자세한 내용은 아래에서 확인 해봅시다
출처 : http://rapapa.net/?p=2472



댓글