WaitForSeconds 캐싱 [TIL 21일차]

장민제·2025년 5월 12일

내일배움캠프

목록 보기
24/41
post-thumbnail

📝 WaitForSeconds

Unity에서 yield return new WaitForSeconds(1f) 같은 코드를 자주 사용할 때, GC(가비지 컬렉션)으로 인해 성능 저하가 발생할 수 있다.
이를 방지하기 위해 WaitForSeconds 객체를 미리 만들어 캐싱해두고 재사용하는 방법에 대해 알게되었다.

💡 왜 이런 기능이 필요한가?

❗ 문제 상황

Unity에서 WaitForSeconds는 단순해 보여도,
계속해서 new 생성자를 통해 새로 WaitForSeconds 객체를 생성해주고 있으므로 계속해서 메모리가 쌓이게된다.

📃 예시 코드

while (true)
{
    yield return new WaitForSeconds(1f);
    DoSomething();
}

이 코드는 1초 대기를 반복하지만, WaitForSeconds(1f)는 매번 new로 생성되기 때문에, 실행 횟수만큼 계속 메모리 할당이 발생한다.

이렇게 생성된 객체는 이후 GC에 의해 수거되는데, GC가 실행되면 짧게나마 프레임이 멈칫할 수 있음.
특히 모바일이나 저사양 기기에서는 이 멈칫거림이 눈에 띄게 느껴질 수 있음.

✅ 이 기능을 쓰면 뭐가 좋은가?

  • GC 할당 최소화WaitForSeconds(1f) 같은 값을 캐싱해두고 재사용하면,
    같은 값에 대해 객체가 한 번만 생성되므로 GC 부담이 줄어듦.

  • 성능 안정화 → 반복적으로 쓰이는 코루틴에서 불필요한 할당이 없으므로 프레임 드랍 없이 안정적인 퍼포먼스 확보.

  • 간편한 사용 → 기존 코드와 비교해도 코드량 차이 없이 바로 적용 가능.

단, 매번 다른 시간 값을 사용하는 경우 (Random.Range() 등)에는 캐싱이 오히려 메모리를 더 사용할 수 있으니, 일정한 시간 간격에서만 사용하는 것이 좋다.

💻 코드

using System.Collections.Generic;
using UnityEngine;

public static class WaitForSecondsCache
{
    private static Dictionary<float, WaitForSeconds> dic = new Dictionary<float, WaitForSeconds>();

    public static WaitForSeconds Wait(float sec)
    {
        if (!dic.ContainsKey(sec))
            dic[sec] = new WaitForSeconds(sec);

        return dic[sec];
    }
}

🧩 결론

반복적인 코루틴이 사용이 많을 때, 메모리 할당을 줄이고 성능을 안정화 하고 싶다면 사용해보면 좋을 거 같다. 😁

profile
Unity, C#

0개의 댓글