일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- RootMotion
- 티스토리챌린지
- UE5
- softeer
- 2294
- UnrealEngine4
- 줄 세우기
- const
- 백준
- 언리얼엔진5
- GeeksForGeeks
- Frustum
- DeferredRendering
- C++
- 팰린드롬 만들기
- Programmers
- 오블완
- RVO
- winapi
- C
- algorithm
- IFileDialog
- Unreal Engine5
- baekjoon
- directx
- 프로그래머스
- DirectX11
- NRVO
- 1563
- UnrealEngine5
- Today
- Total
Game Develop
[UE5] TObjectPtr은 강참조 아니다 본문
여기서 말하는 강참조는 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에 의해 보호받지 않으니 주의.
'UnrealEngine5 > 이것저것' 카테고리의 다른 글
[UE5] USTRUCT를 Value로 하는 TMap을 사용할 때 주의할 점 (1) | 2024.12.02 |
---|---|
[UE5] 월드방향벡터를 캐릭터의 로컬방향벡터로 변환시키고 어떤 방향인지 알아내기 (0) | 2024.11.08 |
[UE5] 행동트리가 블랙보드값 변경을 즉각 반응 못할 경우. (0) | 2024.10.22 |
[UE5] BehaviorTree TaskNode의 InitializeFromAsset VS InitializeFromMemory (0) | 2024.10.05 |
[UE5] 몬스터를 공중에 띄우고 싶을 때. (1) | 2024.10.01 |