본문 바로가기
C#

7. yield return 에 대해 ( 최종화 : 최적화 )

by Oz Driver 2025. 3. 9.

이제까지 yield return과 코루틴을 활용하는 방법을 알아보았습니다. 이번 글에서는 코루틴을 더 효율적으로 사용하는 방법과 InvokeRepeating() 과의 차이점을 살펴보겠습니다.

 

 

WaitForSeconds 캐싱으로 최적화하기

코루틴에서 yield return new WaitForSeconds(time);을 반복적으로 호출하면 매번 새로운 객체가 생성되면서 GC(Garbage Collection) 부담이 생길 수 있습니다. 이를 방지하려면 WaitForSeconds 객체를 미리 생성해서 재사용하는 것이 좋습니다.

 

기존 방식 (비효율적)

IEnumerator ExampleCoroutine()
{
    while (true)
    {
        Debug.Log("실행 중");
        yield return new WaitForSeconds(1f); // 매번 새로운 객체 생성
    }
}

 

최적화된 방식 (효율적)

IEnumerator ExampleCoroutine()
{
    WaitForSeconds wait = new WaitForSeconds(1f); // 미리 생성하여 재사용
    while (true)
    {
        Debug.Log("실행 중");
        yield return wait; // 동일한 객체 사용
    }
}

 

이렇게 하면 불필요한 메모리 할당을 줄여 성능을 최적화할 수 있습니다.

 

 

Update() vs 코루틴 성능 비교

코루틴은 일정한 간격으로 실행해야 하는 작업에 적합하지만, 프레임 단위로 실행되는 로직이라면 Update()가 더 적절할 수도 있습니다.

 

Update() 를 사용할 때 적절한 경우

프레임마다 실행되어야 하는 로직 (예: 입력 처리, 이동, UI 업데이트)

조건에 따라 실행을 멈출 수 있는 경우 (if 문으로 실행 여부를 제어 가능)

 

코루틴을 사용할 때 적절한 경우

특정 간격마다 실행되는 로직 (예: 타이머, 애니메이션 프레임 변경, 비동기 작업)

일정 시간 후 실행되는 작업 (yield return new WaitForSeconds() 활용)

즉, 프레임마다 실행해야 하는 작업은 Update()에서, 일정 간격으로 실행되는 작업은 코루틴에서 처리하는 것이 최적의 선택입니다.

 

 

InvokeRepeating() vs Coroutine

Unity에서는 InvokeRepeating()을 사용하여 일정 시간 간격으로 함수를 호출할 수도 있습니다. InvokeRepeating()과 코루틴의 차이를 이해하는 것이 중요합니다.

 

InvokeRepeating() 의 특징

특정 함수(void 리턴)를 지정된 시간 간격으로 반복 호출.

코루틴처럼 실행 상태를 저장하지 않고, 함수 호출만 반복.

CancelInvoke() 를 사용하여 중지 가능.

void Start()
{
    InvokeRepeating("RepeatFunction", 1f, 2f); // 1초 후 실행 시작, 이후 2초 간격 반복
}

void RepeatFunction()
{
    Debug.Log("반복 실행 중");
}

 

 

 

언제 InvokeRepeating()을 사용할까?

상태를 저장할 필요 없이 단순한 반복 호출을 할 때. (예: 체력 자동 회복, 간단한 타이머 기능)

매우 간단한 반복 작업이 필요할 때.

 

언제 Coroutine 을 사용할까?

시간을 제어하면서 실행을 중단하거나 이어가야 할 때. (예: 애니메이션, 대기 시간 포함된 연속 작업)

yield return을 사용하여 특정 이벤트를 기다려야 할 때.

 

 

마무리

WaitForSeconds 객체를 캐싱하면 GC 부담을 줄여 성능을 최적화할 수 있다.

프레임마다 실행되는 로직은 Update()에서 처리하는 것이 더 효율적이며, 특정 간격마다 실행되는 작업은 코루틴이 적합하다.

InvokeRepeating()은 단순한 반복 호출에 적합하지만, 코루틴처럼 상태를 유지하면서 실행을 관리할 수는 없다.

 

이번 글에서는 코루틴의 최적화 방법과 InvokeRepeating() 과의 차이점을 살펴보았습니다.

이를 통해 더 효율적으로 코루틴을 활용할 수 있을 것입니다!