1. 언리얼 엔진에서의 GC 동작 방식
- overview
- UObject의 파생된 오브젝트가 인스턴스화되면, 언리얼 엔진의 GC 시스템에 등록된다.
- 인스턴스화
- 언리얼 엔진의 GC는 30~60초마다 자동으로 더이상 사용되지 않는 객체를 찾아 제거한다.
- UObject의 파생된 오브젝트가 인스턴스화되면, 언리얼 엔진의 GC 시스템에 등록된다.
- 언리얼 GC 시스템
- 영구적으로 존재하는 Root Set를 가지고 있다.
- reflection을 사용해서 오브젝트의 property를 살펴보고, 참조된 객체에 대해서도 이를 재귀적으로 검사한다.
- 연결된 오브젝트들 중 하나라도 Root Set에 연결되어 있으면, 살아있는 상태로 유지되고
- Root와 연결되지 않은 경우 해제시키고, 이 오브젝트가 가리키던 모든 포인터를 null로 설정한다.
2. Unreal's GC system C++ 코드
- 함수 안에서의 포인터
- C++에서의 동작과 같음
- 잠시 포인터로 특정 변수를 받아서 처리하고, 끝 이런식(아래 코드 처럼)
void AMyClass::Func()
{
AActor* MyOWner = GetOwner();
if(IsValid(MyOwner))
{
//
}
}
- 오브젝트에 대한 포인터가 한 프레임 이상 존재하는 경우의 처리
- 포인터는 멤버 변수에 저장해야 하고, UPROPERTY() 매크로가 있어야 한다.
- UObject 하위 클래스들은 이 매크로를 통해 GC 시스템에 등록되도록 해준다.
- TWeakObjectPtr or FWeakObjectPtr 사용하기
- 오브젝트를 유지하지는 않지만, 오브젝트가 소멸된 후 IsValid를 통해 체크할 수 있기 때문이다.
- 실제로 해당 객체를 책임지지는 않지만, 참조는 유지하면서 그 참조가 유효한지 아닌지 체크할 수 있다.
- 대부분의 경우 사용하지 않는 방식이긴 함
- 포인터는 멤버 변수에 저장해야 하고, UPROPERTY() 매크로가 있어야 한다.
3. 수동으로 특정 객체 파괴하기
- Destroy 함수
- 이 함수를 통해 액터를 파괴하면, 프레임이 끝날 때 월드에서 제거된다.
- 프레임이 끝나기 전까지는 계속 존재하며, 프레임이 끝난 순간 포인터가 null 이 된다.
- IsValid 함수 (객체에 대한 포인터의 유효성 체크)
- 포인터가 nullptr 일때
- Destroy가 호출된 경우(월드에서 제거되지 않았더라도)
- false 반환
4. 수동으로 메모리 관리하기
- new와 delete를 사용해서 C++와 마찬가지의 방법으로 처리할 수 있다.
- new를 통해 생성한 경우, 프로그래머가 해당 메모리를 직접 관리해야 한다.
- 꼭 delete를 해주기
- 단, 일반 C++ 클래스는 언리얼 클래스에 포함되어야 한다.
5. Root Set 수정하기
- 위에서 언급한 root set에는 아무것도 추가하지 말 것
- 추가하면, 크래시 발생한다.
'Unreal Engine' 카테고리의 다른 글
Unreal Engine - 개발 환경 세팅 및 빌드 프로세스 (0) | 2025.01.21 |
---|---|
Unreal Engine Dedicated Server (0) | 2025.01.13 |
Unreal Property System (Reflection) (0) | 2025.01.13 |
Unreal Engine Pointer Types (1) | 2025.01.09 |
UE_LOG 보충 (+ 과제) (1) | 2025.01.07 |