Game Develop

[UE5] TObjectPtr은 강참조 아니다 본문

UnrealEngine5/이것저것

[UE5] TObjectPtr은 강참조 아니다

MaxLevel 2024. 11. 18. 05:46

 

여기서 말하는 강참조는 GC의 수거대상이 안되게 참조하고있다는 의미이다.

간혹 관련해서 구글링하다보면 여러글에서 TObjectPtr을 사용하면 GC가 수거를 안한다고 되어있는데, 내가 실험해본 결과는 아니다.

 

보통 그런글에는 TObjectPtr에 UPROPERTY가 선언되어있는데, 그렇기때문에 수거를 안한거다.

 

나는 실험을 위해 몬스터 때릴때 나오는 데미지위젯을 대상으로 실험해봤다.

기본적으로 데미지위젯은 생성시 AddViewport로 슬레이트시스템에 등록하고 애니메이션재생이 끝나면 RemoveFromParent로 슬레이트시스템에서 제거하게 해놨다.

즉 슬레이트시스템이 강하게참조하는부분은 RemoveFromParent로 삭제했으니 신경 안써도된다.

 

여기서 실험적인 요소를 넣어서, 데미지위젯을 CreateWidget한다음에 아래의 컨테이너들에 집어넣었다.

 

 

1.   TArray<UUserWidget*> m_TestArray;


2.   TArray<TObjectPtr<UUserWidget>> m_TestArray;


      UPROPERTY()
3.   TArray<TObjectPtr<UUserWidget>> m_TestArray;

 

여기서 가비지컬렉팅안된거는 UPROPERTY로 선언한게 유일했다.

즉, TObjectPtr을 사용한다고 메모리 수거를 안하는게 아니라는것... 혹시 UPROPERTY랑 헷갈리지 않았나 생각해보자.

 

여담으로 GC가 수거해간 이후에는, 위 예시에는 안썼지만 TWeakObjectPtr에는 nullptr이 제대로 대입 되어있고 IsValid체크도 false로 잘 된다.

 

다만 TObjectPtr에는 자동으로 nullptr이 대입이 안되니 주의.. IsValid체크는 뭔가 잘 안되는것같고, IsValidLowLevel은 잘 되는 것 같았다.

 

그러니 유효성검사를 필요할때마다 제대로하고싶으면 TWeakObjectPtr을 사용하는게 제일 좋은 것 같다.

GC의 참조횟수에 영향을 주지도 않고, 가리키고있는놈이 해제되면 알아서 nullptr도 넣어주기 때문이다.

 

참고로 UPROPERTY매크로를 사용하더라도, TWeakObjectPtr을 사용하면 GC에 의해 보호받지 않으니 주의.