EveryDay.DevUp

[Unity] Draw Call ( 드로우콜 ), Batching ( 배칭 ) 본문

Unity/최적화

[Unity] Draw Call ( 드로우콜 ), Batching ( 배칭 )

EveryDay.DevUp 2020. 5. 25. 22:27

● Draw Call이란?

: CPU가 GPU에게 오브젝트를 그려라 라는 명령을 내리는 것

▶ 그려라 라는 명령 안에는 메시 정보, 텍스쳐 정보, 쉐이더 정보, 라이트 정보 등 하나의 오브젝트를 그리기 위한 정보가 담겨짐

[ 오브젝트들을 그릴 때의 플로우 ]

▶ 한 프레임이 그려지는 것은 CPU, GPU의 작업이 모두 끝났을 때가 됨. 게임 최적화를 위해서는 CPU의 부하인지, GPU의 부하인지를 체크 해야함

▶ Unity에서는 Batch ( 그리라는 명령 + 상태 변경 )을 넓은 의미의 Draw Call이라고 하며, SetPass는 쉐이더로 인한 렌더링 패스 횟수을 이야기 함

● Draw Call이 발생하는 경우

▶ 하나의 오브젝트에 메시가 여러 개인 경우

▶ 하나의 오브젝트에 여러개의 메터리얼이 있는 경우 

▶ 하나의 쉐이더에 멀티 패스가 정의 되어 있는 경우

● Unity에서 Draw Call 을 줄이기 위한 Batching 시스템

: 서로 다른 메시에서 같은 메터리얼을 쓰는 경우 Unity에서는 해당 Mesh 정보를 하나로 합쳐서 Draw Call 1개로 처리

: 같은 메터리얼을 사용한다고 해서 배칭이 100%되지는 않고 라이트맵, 리플렉션 프로브 등의 영향으로 배칭이 일어나지 않을 수도 있음

Static Batching ( 스태틱 배칭 )

: 움직이지 않는 정적인 오브젝트의 경우 Static 체크를 하면 하나의 메시로 만들어서 처리

: 하나의 메시로 합쳐서 사용하기 때문에, 사용하지 않는 메시 정보도 메모리에 올라가기 때문에 메모리 이슈가 있을 수 있음

 Dynamic Batching ( 다이나믹 배칭 )

: 동적으로 움직이는 오브젝트들을 하나의 메시로 만들어서 처리

: 런타임 상에서 발생하기 때문에 제약 사항이 있음

( 스킨드 메시 적용 불가능, 버텍스 개수가 300개 보다 많은 경우 적용 불가능 )

● Unity에서 Draw Call 을 줄이기 위한 GPU 인스턴싱

: 한번의 Draw Call로 인스턴싱되는 오브젝트들의 정보를 별도의 버퍼에 저장하고 한번에 처리해서 렌더링

: Batching과 달리 메시 정보를 합치는 과정이 없기 때문에 상대적으로 오버헤드가 적음

: 스탠다드 쉐이더를 사용하는 머터리얼의 파라미터 설정으로 처리 가능

( 스킨드 메시 적용 불가능, 디바이스 스펙에 의존적으로 OpenGL ES3.0이상, Vulkan, Metal에서만 가능 )

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

참고 자료 : https://www.youtube.com/watch?v=ffRDriHukSI