728x90
반응형
[GC가 도는 이유 및 최적화 아이디어 소개]
Unity에서 StartCoroutine 호출 시 Unity 엔진 내부에서 인스턴스가 생성되면서 GC가 도는데, 사실 엔진 자체에서 제공하는 기능이기에 이를 완벽하게 GC호출이 안되겐 할 수 없으나, yield문 return시 new 구문에서 YieldInstruction이 생성되어 사용되면서 가비지가 생성되니 YieldInstruction을 미리 캐싱해두는 방식을 사용하여 최적화 하는게 중요합니다!
[코드 및 설명]
# 우선 이 코드는 Unity 공식 포럼에 나온것과, 다른 분들이 짜놓은 코드를 참고하여 저의 경우 WaitForSeconds를 자주 사용하여 이 기능 위주로만 사용하게 살짝 바꿨습니다. 아래 출처 표기했습니다.
namespace Cashing
{
internal static class YieldInstruction
{
class FloatCompare : IEqualityComparer<float>
{
bool IEqualityComparer<float>.Equals(float a, float b)
{
return a == b;
}
int IEqualityComparer<float>.GetHashCode(float a)
{
return a.GetHashCode();
}
}
private static readonly Dictionary<float, WaitForSeconds> waitForSec = new Dictionary<float, WaitForSeconds>(new FloatCompare());
public static WaitForSeconds WaitForSeconds(float seconds)
{
WaitForSeconds w;
if (!waitForSec.TryGetValue(seconds, out w))
{
waitForSec.Add(seconds, w = new WaitForSeconds(seconds));
}
return w;
}
}
}
- internal을 통해 같은 프로젝트 내에서만 접근이 가능하게 했습니다.
- Dictionary를 만들어 seconds마다 WaitForSeconds 인스턴스를 저장하고 있는 방식입니다.
- 가비지가 아예 생성되지 않는건 아니나, 직접 호출보단 적은 양의 가비지가 생성됩니다. 왜냐면 미리 만들어서 이걸 오로지 읽어서 yield return Cashing.YieldInstruction.WaitForSeconds(seconds); 형식으로 사용하면서 저장해놓은 것을 꺼내오는 방식이기 때문입니다.
[참고 문헌]
- UniRX
728x90
반응형
'Unity 끄적임' 카테고리의 다른 글
Unity IL2CPP, JIT, AOT (0) | 2024.05.05 |
---|---|
코루틴(Coroutine) (0) | 2023.11.20 |
[게임수학] 내적, 외적 이야기 (0) | 2023.11.17 |
월드 공간과 UI 공간 (0) | 2023.10.17 |
Coroutine 이야기 (0) | 2022.11.11 |