안선생의 개발 블로그
[UE5] 언리얼 가비지 컬렉션 본문
언리얼 엔진에서 가비지 컬렉션이란?
언리얼 엔진에서 가비지 컬렉션(Garbage Collection)은 메모리 관리를 자동화하는 기능입니다. 가비지 컬렉션은 프로그램이 런타임 중에 동적으로 할당된 메모리를 추적하고, 더 이상 사용되지 않는 메모리를 자동으로 해제하는 프로세스를 의미합니다. 이는 명시적인 메모리 관리 부담을 줄여주고 메모리 누수를 방지하는 데 도움이 됩니다. 언리얼 엔진에서는 Reference Graph 를 만들어 오브젝트들의 사용 여부를 구분한다.
즉 프로그래머가 직접 힙 메로리를 관리할 필요가 없다
Reference Graph
이그래프에는 Root가 존재합니다. Reference Graph의 "루트"는 언리얼 엔진에서 가비지 컬렉션 프로세스를 시작하는 출발점을 나타냅니다. 루트는 가비지 컬렉터에 의해 직간접적으로 참조되는 객체들의 집합이며, 이러한 객체들은 가비지 컬렉션의 대상이 아닙니다. 루트는 가비지 컬렉션의 기준이 되어 언리얼 엔진이 사용 중인 중요한 객체들을 추적합니다.
루트 참조에는 다양한 요소들이 포함될 수 있습니다:
- GameMode 및 GameState:
- 현재 게임의 상태 및 규칙을 관리하는 GameMode 및 GameState 클래스의 인스턴스가 루트에 속합니다.
- PlayerController 및 PlayerState:
- 플레이어 컨트롤러와 플레이어 상태는 루트에 속하며, 이들은 게임 플레이에 필수적인 역할을 합니다.
- Level 스트림 및 레벨 인스턴스:
- 현재 로드된 레벨과 레벨 스트림은 루트에 포함됩니다. 레벨은 가비지 컬렉션의 중요한 부분 중 하나입니다.
- GameInstance:
- GameInstance는 게임 실행 중에 지속되는 데이터와 상태를 관리하는데, 이 또한 루트에 속합니다.
이러한 루트 참조들은 가비지 컬렉터에 의해 추적되어 메모리 관리의 핵심을 담당합니다. 루트에 속한 객체들은 게임이 실행되는 동안 계속해서 참조되어 있어야 합니다. 만약 루트에 속한 객체가 더 이상 참조되지 않으면, 가비지 컬렉션의 대상이 될 수 있습니다.
Reference Graph는 다음과 같은 주요 개념을 포함합니다:
- 객체 간 참조:
- 참조 그래프는 언리얼 엔진의 모든 객체 간의 참조 관계를 표현합니다. 예를 들어, UObject들이 서로를 참조하고 있는 경우 해당 관계가 참조 그래프에 나타납니다.
- 객체 수명 주기:
- 객체가 참조되고 있는 동안에는 가비지 컬렉션의 대상이 되지 않습니다. 참조 그래프를 통해 언리얼 엔진은 객체들 간의 강한 참조 관계를 추적하며, 객체가 더 이상 사용되지 않는지 확인합니다.
- 루트 참조:
- 참조 그래프의 시작점은 루트 참조(root reference)입니다. 루트 참조는 언리얼 엔진에서 유지되어 있는 기본적인 참조로, 메인 게임 모드, 플레이어 컨트롤러, 게임 인스턴스 등과 같은 핵심 객체들이 여기에 포함됩니다.
- 객체의 참조 해제:
- 참조 그래프를 통해 가비지 컬렉션은 언리얼 엔진에서 필요하지 않은 객체를 식별하고, 해당 객체들을 메모리에서 해제할 수 있습니다. 이를 통해 메모리 누수를 방지하고 효율적인 메모리 관리를 할 수 있습니다.
주의 Reference Graph를 그리기 위해서는 엔진에서 UObject reference를 자체적으로 추적할 수 있어야합니다. 그렇기 위해서는 멤버 변수로 사용되는 UObject는 UPROPERTY() 매크로를 가지고있어야 엔진에서 수집할 수 있습니다.
즉 리플렉션을 해줘서 Reference Graph에 추적할 수 있게 해줘야 합니다. 안그러면 가비지컬렉션 대상이 되므로 주의
가비지 컬렉션 특징
- UObject 기반:
- 언리얼 엔진에서 가비지 컬렉션은 주로 UObject 클래스와 그 하위 클래스들에 의해 관리됩니다. UObject는 모든 언리얼 객체의 기본 클래스로, 객체들 간의 참조 관계를 관리하고 가비지 컬렉션 프로세스에 참여합니다.
- 스마트 포인터 및 참조 계수:
- 스마트 포인터와 참조 계수를 사용하여 객체들 간의 참조 관계를 추적합니다. TSharedPtr 및 TWeakPtr를 이용하여 강한 참조와 약한 참조를 관리하며, 참조 계수가 0이 되면 해당 객체는 가비지 컬렉션 대상이 됩니다.
- 루트 세트:
- 게임의 시작 시점에 루트 세트(Root Set)라고 불리는 중요한 객체들의 집합이 정의됩니다. 루트 세트에 속한 객체들은 참조 계수가 0이 되더라도 가비지 컬렉션의 대상이 되지 않습니다. 루트 세트에는 게임 모드, 게임 스테이트, 플레이어 컨트롤러 등이 포함됩니다.
UPROPERTY 선언
클래스 내부 멤버 변수가 클래스의 객체의 수명과 운명을 함께한다면 UPROPERTY 로 선언해야 한다. 이는 수명 주기가 같다는 뜻이다. 반면 잠시 사용할 UObject 나 일반 클래스 객체들은 별도로 관리해 주어야 한다.
요약
1. 가비지컬렉션은 자동으로 메모리를 관리해주는 기능이다.
2. 가비지컬렉션은 Reference Graph루트에 속하지 않으면 자동으로 제거된다.
3. Reference Graph에 속할라면 UPROPERTY매크로를 써줘야 한다. 안그러면 댕글링포인터가 될 수 있음(UObject가 가비지 컬렉션되면, 모든 UPROPERTY Reference가 Null 로 세팅된다. )
4. 스마트 포인터는 참조 계수가 0이 되면 자동으로 가비지 컬렉션 대상이 된다.
5. 루 트 세트에 속한 객체들은 참조 계수가 0이 되더라도 가비지 컬렉션의 대상이 되지 않는다
6. 중요한 객체들은 루트 참조에 속하도록 설정되어야 합니다. 루트 참조에 있는 객체들은 게임의 생명주기 동안 계속해서 참조되어 있어 가비지 컬렉션의 대상이 아닙니다.
가비지컬렉션은 동적에서만 관리 하므로 int,bool에 리플렉션해도 가비지컬렉션에서 관리되지 않는다 리플렉션 하는 이유는 블루프린트랑 연결하기 위함
'언리얼' 카테고리의 다른 글
[UE5] 언리얼 Mixamo 루트모션 적용 (1) | 2023.12.21 |
---|---|
[UE5] 리플렉션 (0) | 2023.12.14 |
[UE5] 언리얼 스마트 포인터 (0) | 2023.12.03 |
[UE5] TWeakObjetPtr (0) | 2023.11.27 |
[UE5] 애니메이션 블루프린트 (0) | 2023.11.13 |