본문 바로가기
Unity 끄적임

Coroutine - 가비지 줄이기

by Dev_Hugh 2022. 11. 11.
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

- Unity Forum

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