유니티 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, 캐싱, 메모리 관리 전략

//
   

댓글 남기기

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

Please turn AdBlock off

Notice for AdBlock users

Please turn AdBlock off