언리얼 엔진에서 구현된 가비지 컬렉션에 대해 정리해보았습니다.
구글링 및 Gemini를 참고했습니다.
언리얼 엔진의 Garbage Collection(GC)
C#과 달리 C++은 가비지 컬렉션을 제공하지 않습니다.
그래서 언리얼 엔진에서는 가비지 컬렉션을 직접 구현하여 제공하고 있습니다.
GC란 '더 이상 사용하지 않게된 객체 (= 다른 객체에서 참조하지 않는 객체) '를
시스템에서 자동으로 해제해주는 기능을 말합니다.
언리얼은 리플렉션 시스템을 사용하여 GC를 수행합니다.
리플렉션이란 런타임 중에 객체가 자기 자신 정보를 파악할 수 있게 해주는 시스템입니다.
리플렉션 시스템이 있기 때문에 엔진이 객체의 속성을 알 수 있고, 사용되지 않는 객체를 구분할 수 있습니다.
언리얼 엔진에서 UObject를 상속받은 객체들은 모두 GC의 관리를 받습니다.
그리고 이 UObject들이 더 이상 참조되지 않는지 Reference Graph를 통해 파악합니다.
Reference Graph
레퍼런스 그래프의 루트는 Root Set 라는 오브젝트 세트가 지정되어 있습니다.
어떤 UObject도 AddToRoot 함수를 통해 Root Set에 추가될 수 있습니다.
언리얼의 GC는 "Mark and Sweep" 방식으로 작동합니다.
- Mark (표시): '루트 셋(Root Set)'에서 시작해서 Reference Graph를 순회하며 모든 UObject를 찾아가며 "이건 사용 중!"이라고 표시합니다.
- Sweep (삭제): 표시되지 않은, 즉 어디에서도 참조되지 않는 객체들을 메모리에서 지워버립니다.
가비지 컬렉터와 UPROPERTY()
UObject에서 포인터는 UPROPERTY() 를 선언하여 GC에서 추적이 가능하도록 해야합니다.
UPROPERTY()가 선언되지 않은 포인터는 레퍼런스 그래프에서 누락되어,
실제 사용 중임에도 GC에 의해 메모리가 해제될 수 있습니다.
이 경우 해당 포인터는 잘못된 주소를 가리키는 댕글링 포인터가 되어 런타임 크래시를 유발합니다.
TWeakObjectPtr
모든 UObject들은 GC를 통해 파괴될 수 있기 때문에 UPROPERTY를 선언하여 이를 방지해야 합니다.
하지만 UPROPERTY는 내부적으로는 강한 참조를 이용하기 때문에 객체의 생명주기에 관여하고 싶지 않지만 참조는 해야 할 때 TWeakObjectPtr를 사용합니다.
또한 서로가 서로를 참조하는 순환참조를 하게되는 경우, 참조 그래프가 비대해집니다.그래서 서로 참조해야하는 경우 한쪽은 UPROPERTY, 다른쪽은 TWeakObjectPtr로 약하게 참조해주면 GC의 부담을 줄여줄 수 있습니다.
TWeakObjectPtr는 참조하는 대상이 파괴되는 경우 nullptr로 세팅되고, 객체가 파괴되었는지 안전하게 확인할 수 있는 IsValid() 기능을 제공합니다.
'GameDevelop > UnrealEngine' 카테고리의 다른 글
| UnrealEngine - 언리얼엔진의 UI 렌더링 과정 (1) | 2025.12.31 |
|---|---|
| UnrealEngine - UObject와 AActor (0) | 2025.12.18 |
| UnrealEngine - 변수 UI에 붙이기 (블루 프린트 사용) (7) | 2024.09.14 |
| UnrealEngine - UPROPERTY / 코드 변경사항 에디터에 즉시 적용 / 라이브 코딩 (0) | 2024.09.10 |
| UnrealEngine 5.4 - unsupported architecture... 에러 해결방법 (0) | 2024.09.09 |