티스토리 뷰

Unity3d

드로우 콜(Draw call) 배칭(Batching)

arga32wr32 2016. 4. 15. 01:11

드로우 콜(Draw call)

오브젝트, 파티들 등은 CPU에 의해 연산된 정보를 GPU에서 가공하여 최종적으로 화면에 보이게된다. CPU에서 생산된 정보를 버퍼를 통해 GPU로 전달한다. 쉽게 말해 CPU가 GPU에게 이거 화면에 그려(Draw)달라고 요청(call)하는 것이다. 이것을 드로우 콜(Draw call) 이라한다. 


유니티 현재 버전(5.x)에서는 Batches로 표시된다.


병목현상

게임 중 화면에 표시할 오브젝트가 많아서 Draw call 도 많아졌다. CPU에서는 정보들을 빨리 연산하여 GPU에게 넘겨줘야하지만 오브젝트가 너무 많아 신속하게 처리가 안된다. 이러한 병목현상이 나타마면 갑자기 화면이 멈춘것처럼 보이거나. 끊기는 현상이 발생한다. CPU의 부담이 커져서 열도 많이나고 베터리 소모도 많아진다. 이렇게 지체되는 시간을 오버헤드(Overhead)라고한다. 


병을 거꾸로 했을 때 내용물이 병의 목 부분에서 잘 빠져나오지 못한다.


아틀라스(Atlas)

병목현상 없이 게임이 진행되기 위해, 다양한 방법이 있지만 그중에서 드로우 콜을 최소화 해야한다. 오브젝트의 수가 많더라도 같은 텍스처를 사용한다면 드로우콜은 한 번만 발생한다. 그래서 하나의 텍스처에 많은 이미지들을 모아둔다. 이것을 아틀라스라고 한다.

위 그림처럼 각각의 Cube 오브젝트가 각각의 텍스처를 사용한다고 했을 때 드로우 콜은 4가 발생한다.


하지만 4개의 텍스처를 하나의 아틀라스로 묶어 사용한다면 드로우 콜은 1이 된다. 아틀라스 크기도 2의 배수(Power of 2) 단위라 사용하는 것이 좋다. 32, 64, 128, 256, 512, 1024, 2048 ...


동적 배칭(Dynamic batching)

여러 오브젝트가 동일한 머터리얼을 사용한다면 자동으로 배칭을 해준다. 단, 버텍스 제한이 존재한다. 멀티 쉐이더를 사용하거나 실시간 그림자가 적용 된다면 배칭에서 제외된다.


정적 배칭(Static batching)

게임 오브젝트를 인스펙터에서 보면 Static 체크가 있다. 이것을 체크하면 해당 오브젝트를 Static baching으로 처리하여 CPU의 부담이 줄어든다. 하지만 메모리의 부담은 늘어난다. 경우에 따라서는 Static 체크를 해제하는 것이 더 유리할 때도 있다. 정적 배칭은 unity pro에서만 지원한다.


머터리얼과 쉐어드 머터리얼

게임 중 동적으로 머터리얼을 변경해야하는 상황이 발생할 수 있다. 이 경우 sharedMaterial 을 사용하여 변경하는게 더 좋다. 

using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour
{
    public Material myMaterial;
    public Renderer myRenderer;

    void Start()
    {
        myRenderer = GetComponent<renderer>();
        myRenderer.enabled = true;
    }

    void ChangeMaterial()
    {
        myRenderer.material = myMaterial;
        myRenderer.sharedMaterial = myMaterial;
    }
}

위 코드에서 myRenderer.material 과 myRenderer.sharedMaterial 둘 모두 머터리얼을 교체하는 코드이다. 결과는 같다. 하지만 머터리얼을 처리하는 과정은 서로 다르다. myRenderer.material 을 사용하는 것은 머터리얼을 복사하는 과정이 생겨 드로우콜이 하나 더 발생한다. 하지만 sharedMaterial 을 사용할 경우 배칭이 발생하여 공유할수 있는 머터리얼을 사용하여 추가 드로우콜이 발생하지 않는다. 무조건 드로우 콜이 추가로 발생하지 않는 것은 아니다. 공유 조건에 부합되지 않는다면 sharedMaterial 를 사용하여도 추가로 드로우콜이 발생할 수있다.


참고 : http://docs.unity3d.com/kr/current/Manual/DrawCallBatching.html

댓글