Notice
Recent Posts
Recent Comments
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 델리게이트
- tweakobjectptr
- stl
- 선택정렬
- unorder_map
- 자료구조
- 정렬
- C++
- 데이터애셋
- UE_LOG
- 크리티컬섹션
- 프로그래머스
- 비동기호출방법
- 애셋로드
- map
- enumasByue
- 약참조
- 구조적 바인딩
- dataasset
- 강참조
- BFS
- 정렬알고리즘
- UML관련
- 람다
- 스마트포인터
- makeweakobjectptr
- C++최적화
- 언리얼가비지컬렉터
- moreeffectiveC++
- 알고리즘
Archives
- Today
- Total
기억을 위한 기록들
[UE] FGCObject에 관하여 본문
FGCObject란 언리얼 엔진의 가비지 컬렉션(이하 GC) 시스템에게 "이 UObject는 내가 가지고 있으니 지우지 마"라고 알려주는 인터페이스이다.
UPROPERTY()가 없이 보관해야 할 경우 GC가 모르게 들고 있다가 크래시나는 문제를 해결하는 안전한 방법이다.
언리얼엔진의 GC는 UObject를 자동으로 추적하지는 않는다.
GC가 자동으로 추적하는 경우는 다음과 같다.
- 리플렉션 시스템에 등록된 객체일 경우
- RootSet에 등록 된 경우
문제는 다음과 같은 경우들에서 발생한다.
- 일반 C++ 클래스에서 UObject* 포인터를 저장할 경우
- TSharedPtr안에서 UObject 넣어야 할 경우
- 커스텀으로 사용하는 UObjectPoolingManager 처럼 GC 외부에서 관리하는 경우
GC 입장에서는 이렇게 생각한다:
“어? 이 UObject를 참조하는 곳이 없네? → 처리!”
그리고 포인터는 dangling pointer(죽은 포인터) 가 되고,
사용하는 순간 크래시로 이어진다.
-> 이때 필요한 것이 FGCObject.
문제 상황 예시 : Non-UObject 클래스가 UObject를 저장할 경우
class FMyManager
{
public:
UObject* CachedObj; // 위험! GC가 모름
};
해결 상황 : FGCObject를 상속받고, AddReferencedObjects 함수 구현
class FMyManager : public FGCObject
{
public:
UObject* CachedObj = nullptr;
virtual void AddReferencedObjects(FReferenceCollector& Collector) override
{
Collector.AddReferencedObject(CachedObj);
}
virtual FString GetReferencerName() const override
{
return TEXT("FMyManager");
}
};
이제 언리얼 GC는 다음과 같이 인식한다:
"CachedObj 객체는 참조되고 있으니, 제거하면 안 되겠다"
응용 : 풀에 있는 개체가 GC에 수거되지 않는다. 풀링 시스템에서도 안전하게 객체를 재사용할 수 있다.
class FObjectPool : public FGCObject
{
public:
TArray<UObject*> Pool;
virtual void AddReferencedObjects(FReferenceCollector& Collector) override
{
Collector.AddReferencedObjects(Pool);
}
};
결론
FGCObject가 중요한 경우
- Non-UObject 클래스에서 UObject를 들고 있어야 할 때
- UObject Pooling, 싱글톤 매니저 등에서 GC 대상 제외가 필요할 때
- UPROPERTY를 붙일 수 없는 곳에서 안전하게 UObject를 관리하려고 할 때
UPROPERTY가 안 된다면 FGCObject를 고려해야 한다.
'UnrealEngine' 카테고리의 다른 글
| [UE][영상 참고 글]Unreal Engine에서 모듈식 & 확장 가능한 UI 시스템 만들기 (0) | 2025.12.26 |
|---|---|
| [UE] 언리얼엔진 RPC와 Replication 에 관하여 (0) | 2025.09.26 |
| [UE] 월드 내 액터 탐색 할 때에는 TActorIterator 라는 클래스 템플릿이 있다. (1) | 2025.07.01 |
| [UE] UObject 객체에 대해 참조 할때, TWeakObjectPtr<T> 템플릿 클래스 말고도, MakeWeakObjectPtr 함수가 있다. (0) | 2025.06.08 |
| [UE] 블루프린트에서 비동기방식을 다루고 싶다면 UBlueprintAsyncActionBase 클래스를 사용하자. (0) | 2025.05.31 |