언리얼에서는 더이상 참조되지 않거나 명시적으로 소멸 예약시킨 UObject 를 주기적으로 정리하는 가비지 컬렉션(garbage collection) 스키마를 사용한다. 가비지 컬렉션이 발생하면 엔진은 루트 세트부터 시작해서 알려진 UObject 레퍼런스 트리를 검색하여 참조된 오브젝트를 전부 추적할 수 있다. 참조되지 않은, 즉 트리 검색에서 찾지 못한 것들은 더이상 필요치 않은 오브젝트가 가정하고 제거한다.
전형적으로는 살려두고자 하는 오브젝트에 UPROPERTY 레퍼런스를 유지하거나, 그에 대한 포인터를 TArray 또는 다른 언리얼 엔진 컨테이너 클래스에 저장해야 한다. 종종 액터와 그 컴포넌트는 예외인데, 액터는 보통 자신이 속한 레벨처럼 루트 세트로 다시 링크되는 오브젝트에, 그리고 액터의 컴포넌트는 액터 자체에 레페런싱되기 때문이다. 액터는 자신의 Destroy 함수를 호출하여 명시적으로 소멸 마킹할 수 있는데, 이는 진행중인 게임에서 액터를 제거하기 위한 표준적인 방식이다. 컴포넌트는 DestroyComponent 함수로 명시적으로 소멸시킬 수 있으나, 보통은 소유 액터가 게임에서 제거될 때 소멸됩니다.
// 가비지 컬렉션
UCLASS() //마크업
class MyGCType : public UObject *UObject 파생 클래스여야 GC 활성화 됨.
{
GENERATED_BODY() //마크업
};
UCLASS()
class AMyActor : public AActor //Actor는 보통 GC 안됨. Destory() 함수를 호출해줘야 함.
{
GENERATED_BODY() //마크업
public:
UPROPERTY() //마크업
MyGCType* SafeObject;
MyGCType* NonSafeObject; //마크업 안해서 GC에 의해 소멸됨. 다음 GC 타임에.
AMyActor(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
{
SafeObject = NewObject<MyGCType>();
NonSafeObject = NewObject<MyGCType>();
}
};
*bool IsPendingKill() 메서드를 사용하여 GC 대기중인기 확인 가능.
UStructs 는 가비지 컬렉팅 불가능.
|
'::protected > 언리얼4&5' 카테고리의 다른 글
콜리전(Collision) (0) | 2019.11.12 |
---|---|
프로퍼티 시스템(리플렉션_Reflection) (0) | 2019.11.12 |
TSubclassOf (0) | 2019.11.12 |
오브젝트(Object) 생성 (0) | 2019.11.12 |
TSet (0) | 2019.10.17 |