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];
}
}
반복적인 코루틴이 사용이 많을 때, 메모리 할당을 줄이고 성능을 안정화 하고 싶다면 사용해보면 좋을 거 같다. 😁