유니티 GC 줄이는 방법을 이해하면 프레임 드랍 문제를 효과적으로 해결할 수 있습니다.
유니티 가비지 컬렉션은 자동으로 메모리를 정리해주지만, 반복되는 할당이 많으면 성능 문제를 발생시킬 수 있습니다.
이전 글에서는 유니티 GC를 발생시키는 코드 패턴을 정리했습니다.
이제 가장 중요한 단계입니다.
👉 어떻게 줄일 것인가
GC 문제는 원리를 아는 것보다, 실제로 줄이는 것이 훨씬 중요합니다.
이 글에서는 유니티 GC를 줄이기 위한 실전 방법을 정리합니다.
유니티 GC 줄이기의 핵심
유니티 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 완벽 가이드)