2014년 8월 18일 월요일

[Unity] Coroutine과 yield의 활용방법

Unity Programming에 있어서 Coroutine을 사용하는것은 가장 현실적인 성능 개선 방법입니다.
Unity특성상 Target Platform의 수가 많은만큼, Program의 성능이 높아져야하기때문에 Coroutine은 사실상 필수입니다.
코드의 가독성은 덤입니다.

Coroutine을 사용한 구현과 사용하지 않은 구현을 비교해보겠습니다.

// Coroutine 사용
IEnumerator Function(string a, string b, string c)
{
    yield return new WaitForSecond(2f); // 2초 대기
    Debug.Log(a);
    yield return new WaitForSecond(2f);
    Debug.Log(b);
    yield return new WaitForSecond(2f);
    Debug.Log(c);
}

void Start()
{
    StartCoroutine(Function("FirstAction","SecondAction","ThirdAction"));
}


// Coroutine 사용하지않음
string a;
string b;
string c;
bool isAFinished;
bool isBFinished;
bool isCFinished;
float  runningTime;

void Start()
{
    a = "FirstAction";
    b = "SecondAction";
    c = "ThirdAction";
    isAFinished = false;
    isBFinished = false;
    isCFinished = false;
    runningTime = 0f;
}

void Update()
{
    runningTime = runningTime + Time.deltaTime;
    if( runningTime > 2f && isAFinished == false)
    {
        Debug.Log(a);
        isAFinished = true;
    }

    if( runningTime > 2f+2f && isBFinished == false)
    {
        Debug.Log(b);
        isBFinished = true;
    }

    if( runningTime > 2f+2f+2f && isCFinished == false)
    {
        Debug.Log(c);
        isCFinished = true;
    }
}


같은 기능을 하는 코드입니다.
가장 먼저 느껴지는 차이점은 가독성입니다.
그 다음은 성능인데, Coroutine의 경우 심플합니다.
하지만 Coroutine을 사용하지 않은 경우는 세 문자열을 다 출력하는데 1080번의 if문을 실행합니다.
거기다 정상적으로 작동하고나서도 초당 180번의 if문을 실행하게됩니다.


코드를 더 줄일수있긴 합니다.
Start()를 선언할때 IEnumerator를 붙여주면 유니티에서 Coroutine으로 호출해줍니다.
IEnumerator Start()
{
    yield return new WaitForSecond(2f);
    Debug.Log("FirstAction");
    yield return new WaitForSecond(2f);
    Debug.Log("SecondAction");
}

Coroutine에서는 yield 키워드를 사용해서 기능을 사용하게 되는데, yield 관련 키워드는 다음과 같습니다.

yield return null
다음 Update까지 대기

yield return new WaitForSeconds(float)
지정된 시간만큼 대기

yield return new WaitForFixedUpdate()
다음 FixedUpdate까지 대기

yield return new WaitForEndOfFrame()
렌더링이 끝날 때까지 대기

yield return StartCoroutine(function)
StartCoroutine안에 넣은 코루틴이 끝날 때까지 대기

yield return WWW
WWW 작업이 끝날 때까지 대기

댓글 2개: