유니티 GC를 발생시키는 코드 패턴 (Update에서 하면 위험한 것들)

유니티 GC 발생 원인을 제대로 이해하면 프레임 드랍 문제를 빠르게 해결할 수 있습니다.

유니티 GC는 특정 순간 갑자기 발생하는 것이 아니라, 대부분 코드 패턴에서 반복적으로 만들어집니다.

이제 유니티 가비지 컬렉션을 이해했다면, 가장 중요한 단계로 넘어가 봅시다.

👉 실제로 GC를 발생시키는 코드가 무엇인지 아는 것

많은 경우 GC는 “특정 기능” 때문에 발생하는 것이 아니라,
일상적으로 작성한 코드 때문에 발생합니다.

특히 문제는 이겁니다.

👉 매 프레임 반복되는 코드에서 GC가 발생하는 경우

이 글에서는 유니티에서 GC를 자주 발생시키는 대표적인 코드 패턴을 정리합니다.


유니티 가비지 컬렉션이 위험해지는 순간

유니티 GC 발생 원인과 Update에서 반복되는 메모리 할당 코드 패턴을 설명하는 다이어그램
유니티에서 GC는 대부분 Update에서 반복되는 객체 생성과 메모리 할당 패턴으로 인해 발생합니다.

👉 GC는 특정 기능이 아니라, 반복되는 코드 패턴에서 만들어집니다.

 

GC 자체는 문제가 아닙니다.

문제는 “언제 발생하느냐”입니다.

  • 로딩 화면 → 괜찮음
  • 게임 플레이 중 → 문제

특히 다음 조건이 겹치면 위험합니다.

  • Update / LateUpdate / FixedUpdate 내부
  • 작은 메모리 할당 반복
  • 프레임마다 실행

👉 이 조건이 모이면 GC는 반드시 발생합니다.


1. Update에서 new 객체 생성

가장 흔한 실수입니다.

void Update()
{
    var obj = new MyClass();
}

이 코드는 매 프레임마다 새로운 객체를 생성합니다.

이 객체는 곧 사용되지 않기 때문에 GC 대상이 됩니다.

문제는 이 작업이 계속 반복된다는 점입니다.

👉 해결 방법: 객체 재사용 또는 Object Pooling


2. 문자열(string) 연산

문자열은 불변(immutable)입니다.

즉, 문자열을 수정하면 새로운 객체가 생성됩니다.

void Update()
{
    string text = "Score: " + score;
}

이 코드는 매 프레임마다 새로운 문자열을 생성합니다.

UI 업데이트에서 자주 발생하는 패턴입니다.

👉 해결 방법: StringBuilder 또는 캐싱


3. LINQ 사용

LINQ는 편리하지만 내부적으로 객체를 생성합니다.

var result = list.Where(x => x > 10).ToList();

이 코드는 중간 객체와 리스트를 생성합니다.

Update에서 사용하면 GC를 유발할 가능성이 큽니다.

👉 해결 방법: for문 사용 또는 캐싱


4. 박싱(Boxing)

값 타입이 object로 변환될 때 박싱이 발생합니다.

int value = 10;
object obj = value;

이 과정에서 힙에 객체가 생성됩니다.

특히 인터페이스, 컬렉션, 로그 출력에서 자주 발생합니다.

👉 해결 방법: 제네릭 사용 또는 타입 명확히 유지


5. foreach 사용 (주의 필요)

모든 foreach가 문제는 아닙니다.

하지만 특정 컬렉션에서는 GC를 발생시킬 수 있습니다.

foreach (var item in list)
{
    // 작업
}

특히 struct 기반이 아닌 경우, 또는 boxing이 발생하면 GC가 생길 수 있습니다.

👉 해결 방법: 성능이 중요한 구간에서는 for문 사용


6. 임시 배열 / 컬렉션 생성

void Update()
{
    int[] arr = new int[10];
}

이 역시 매 프레임마다 새로운 배열을 생성합니다.

작은 크기라도 반복되면 GC 대상이 됩니다.

👉 해결 방법: 배열 재사용 또는 static 사용


유니티 GC 문제의 핵심 패턴

지금까지 내용을 한 줄로 정리하면 이렇습니다.

👉 “매 프레임 새로운 객체를 만들면 GC는 반드시 발생한다”

즉, 문제가 되는 것은 특정 기능이 아니라 “코드 작성 방식”입니다.


실전 체크 포인트

  • Update 안에서 new 사용 여부
  • 문자열 연산 반복 여부
  • LINQ 사용 위치
  • 박싱 발생 여부
  • 임시 배열 생성 여부

👉 이 다섯 가지만 확인해도 대부분의 GC 문제를 잡을 수 있습니다.


정리

  • 유니티 가비지 컬렉션은 반복되는 할당에서 발생한다
  • 특히 Update 내부 코드는 가장 위험하다
  • 문제는 “큰 할당”이 아니라 “작은 할당의 반복”이다

👉 GC 문제는 코드 패턴을 바꾸는 것만으로도 대부분 해결됩니다.


다음 글에서 다룰 내용

다음 글에서는 GC를 줄이는 실제 방법을 정리합니다.

👉 Object Pooling, 캐싱, 메모리 관리 전략

댓글 남기기

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