
0. 서론
유니티를 통해 게임을 개발하면서 자주 듣는 조언 중 하나는 가비지 컬렉터를 신경써서 관리를 해야한다는 것이다.
예를들어 오브젝트 풀과 같은 디자인 패턴을 사용하는 이유가 가비지 컬렉터의 작동을 최소화 하여 성능 저하를 방지하기 위해서이다.
그런데 가비지 컬렉터가 구체적으로 무엇이기에 관리를 해주어야 하는지 궁금해져, 이번 기회에 가비지 컬렉터의 개념, 작동 원리, 그리고 어떻게 관리해줄 수 있는지를 정리하고자 했다.
1. 가비지 컬렉터란?
가비지 컬렉션(Garbage Collection 이하 GC)은 사용하지 않은 메모리를 자동으로 해제하는 메모리 관리 기법이다.
C#에서는 .NET 런타임에서 GC가 동작하며, 개발자가 메모리를 직접 수동으로 해제하지 않아도, 자동으로 힙 메모리에서 참조되지 않는 객체를 찾아서 해제한다.
즉 GC는 불필요한 메모리를 계속 사용해, 메모리 누수가 일어나는 것을 방지하는 역할을 한다.
유니티도 C#을 이용하므로 GC가 런타임에서 동작한다.
1.1. 가비지 컬렉터의 동작 원리
GC는 루트 객체에서 시작해, 해당 객체가 참조하는 다른 객체를 따라가며 참조 그래프를 탐색한다
여기서 접근이 불가능한 객체를 '가비지'로 간주해 메모리를 해제한다.
메모리를 해제한 후에는 힙 메모리를 정리하여 메모리 할당이 효율적으로 이루어질 수 있도록 한다.
1.2. 세대(Generation)
하지만 모든 객체를 같은 빈도로 일일히 체크하는 것은 비효율적이다. 이를 해결하기 위해 GC는 세대 개념을 이용해 최적화 한다.
- 0세대
새롭게 생성된 객체는 0세대로 분류가 된다. GC는 0세대에서 메모리 해제 작업을 가장 빈번하게 질행한다.
- 1세대
0세대에서 살아남은 객체들은 1세대가 되며, 0세대보다는 덜 빈번하게 GC작업이 실행된다.
- 2세대
1세대에서도 청소되지 않은 객체가 2세대 객체가 되며, 가장 드물게 GC 작업이 실행된다.
또한 매우 큰 객체는 별도의 힙(LOH, Large Object Heap)에 저장되어 세대와 별도로 관리한다.
이로서 GC는 자동으로 객체간 우선순위를 정해 스스로 최적화하고자 한다.
그런데 이렇게 자동으로 메모리 할당을 해제해준다면 편리한 기능처럼 보이는데 왜 GC의 관리가 필요할까?
2. 왜 신경써야 하는가?
그러나 GC는 실행중인 프로그램을 일시적으로 멈추고 동작한다. 프레임단위로 동작하는 유니티의 경우, 0세대의 GC가 동작할 때, 플레이어는 랙이나 프레임드랍을 경험할 수 있다.
LOH에 저장된 객체가 많아지면 메모리 압축 비용이 증가하고 GC 실행기간이 길어질 수 있다.
GC은 개발자가 호출하지 않더라도 자동으로 진행된다. 이는 분명 편리한 것이 맞지만, 반대로 이야기하면 GC의 작동 순간을 개발자가 제어하지 못한다는 의미이기도 하다. 따라서 GC가 실행되는 빈도와 순간을 최소화하는 것이 중요하다.
이를 위해 할 수 있는 것은 대표적으로 다음과 같다.
1. 객체 생성을 최소화
매 프레임마다 새로운 객체를 생성하고 제거하지 않도록 데이터 구조를 재사용할 수 있다.
2. 오브젝트 풀 사용
오브젝트풀이 대표적으로 GC를 관리하는 디자인 패턴이다. 적 유닛이나, 총알처럼 다수의 오브젝트가, 많이, 자주 생성되고 파괴되어야하는 객체는 미리 생성하고, 파괴하지 않고 비활성화만 한 뒤, 필요할 때 다시 활성화하는 식으로 생성과 파괴를 최소화할 수 있다.
3. 결론
가비지 컬렉션은 분명히 편리한 메모리 관리 기능을 제공해준다. 그러나 실시간 게임 환경에서는 성능 저하를 유발할 수 있는 잠재적 요소이다.
특히 GC가 자동으로 작동하며 프레임 드랍이 발생하면 플레이어의 게임 경험에 악영향을 끼칠 수 있다.
따라서 GC가 자주 호출되지 않도록 최적화하는 것이 중요하다.
'내일배움캠프 TIL' 카테고리의 다른 글
| 내일배움캠프 84일차 TIL "클래스와 구조체의 차이" (0) | 2025.01.16 |
|---|---|
| 내일배움캠프 83일차 TIL "CSV형태의 대사 변환" (0) | 2025.01.15 |
| 내일배움캠프 82일차 TIL "퀘스트 완료 처리" (0) | 2025.01.14 |
| 내일배움캠프 81일차 TIL "퀘스트 감지 처리" (0) | 2025.01.13 |
| 내일배움캠프 80일차 TIL "NPC 위치에 따른 표시" (0) | 2025.01.10 |