유니티 GC 줄이는 방법 (Object Pooling, 캐싱, 메모리 최적화 전략)

유니티 GC 줄이는 방법을 이해하면 프레임 드랍 문제를 효과적으로 해결할 수 있습니다.

유니티 가비지 컬렉션은 자동으로 메모리를 정리해주지만, 반복되는 할당이 많으면 성능 문제를 발생시킬 수 있습니다.

 

이전 글에서는 유니티 GC를 발생시키는 코드 패턴을 정리했습니다.

이제 가장 중요한 단계입니다.

👉 어떻게 줄일 것인가

GC 문제는 원리를 아는 것보다, 실제로 줄이는 것이 훨씬 중요합니다.

이 글에서는 유니티 GC를 줄이기 위한 실전 방법을 정리합니다.


//
//

유니티 GC 줄이기의 핵심

유니티 GC를 줄이는 방법을 한눈에 정리하면 다음과 같습니다.

유니티 GC 줄이는 방법과 Object Pooling, 메모리 재사용 전략을 설명하는 다이어그램
유니티 GC는 반복되는 메모리 할당을 줄이고 객체를 재사용하는 것만으로도 크게 감소시킬 수 있습니다.

👉 GC 최적화는 결국 “재사용”과 “반복 제거”입니다.

먼저 가장 중요한 개념부터 정리하겠습니다.

👉 GC를 “없애는 것”이 아니라 “발생을 줄이는 것”

GC는 반드시 필요합니다.

문제는 불필요한 할당 때문에 너무 자주 발생하는 것입니다.

따라서 목표는 다음과 같습니다.

  • 불필요한 메모리 할당 줄이기
  • 반복되는 할당 제거
  • GC 타이밍 제어

1. Object Pooling

가장 효과적인 방법입니다.

객체를 매번 생성하는 대신, 미리 만들어두고 재사용하는 방식입니다.

Queue pool = new Queue();

GameObject Get()
{
    if (pool.Count > 0)
        return pool.Dequeue();

    return Instantiate(prefab);
}

void Return(GameObject obj)
{
    obj.SetActive(false);
    pool.Enqueue(obj);
}

👉 new 대신 재사용

이 한 가지 원칙만 지켜도 GC 발생이 크게 줄어듭니다.


//

2. 문자열 처리 최적화

문자열은 GC를 자주 유발합니다.

특히 UI 업데이트에서 문제가 됩니다.

// 나쁜 예
text.text = "Score: " + score;

👉 해결 방법

  • StringBuilder 사용
  • 변경될 때만 업데이트

매 프레임 문자열을 만드는 것은 피해야 합니다.


3. 컬렉션 재사용

List, 배열을 매번 새로 만들지 말고 재사용하세요.

list.Clear();

👉 Clear 후 재사용이 핵심입니다


4. LINQ 제거

LINQ는 편하지만 GC를 유발합니다.

// 나쁜 예
var result = list.Where(x => x > 10).ToList();

👉 해결 방법

for (int i = 0; i < list.Count; i++) { if (list[i] > 10)
    {
        result.Add(list[i]);
    }
}

성능이 중요한 구간에서는 명시적인 루프가 더 좋습니다.


5. 박싱(Boxing) 제거

박싱은 힙 할당을 발생시킵니다.

특히 인터페이스, object 타입에서 자주 발생합니다.

👉 해결 방법

  • 제네릭 사용
  • object 사용 최소화

6. Update 최적화

모든 GC 문제는 여기로 모입니다.

👉 Update에서 할당을 없애는 것

이게 핵심입니다.

  • new 금지
  • 문자열 생성 금지
  • LINQ 금지

Update는 “계산”만 하는 공간이어야 합니다.


GC 타이밍 관리

가능하다면 GC가 발생하는 타이밍을 제어하는 것도 중요합니다.

  • 로딩 화면에서 실행
  • 씬 전환 시 실행

👉 플레이 중 GC는 최대한 피해야 합니다


실전 체크리스트

  • Update 내부 new 사용 여부
  • 문자열 연산 여부
  • 컬렉션 생성 여부
  • LINQ 사용 여부
  • 박싱 발생 여부

👉 이 다섯 가지만 확인해도 대부분 해결됩니다


정리

  • GC는 없애는 것이 아니라 줄이는 것
  • 핵심은 반복되는 할당 제거
  • Object Pooling이 가장 효과적

👉 GC 최적화는 코드 습관을 바꾸는 것에서 시작됩니다


다음 글

다음 글에서는 Profiler를 활용해 GC를 확인하는 방법을 정리합니다.

👉 유니티 GC 확인 방법 (Profiler 완벽 가이드)

//
   

댓글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

Please turn AdBlock off

Notice for AdBlock users

Please turn AdBlock off