언리얼에선 UObject 클래스로부터 파생된 클래스와 액터의 메모리를 자동으로 관리해준다.
수집된 잔여 메모리(GC)를 시스템에 반환하지 않고 풀링하고, 새로운 메모리를 필요로 할 때 메모리 풀에서 먼저 가져온다.
UObject 에서 파생되지 않은 클래스를 작성할 땐 TSharedPtr, TWeakPtr을 사용하자.
UObject 에서 포인터는 UPROPERTY를 추가해서 관리하기 쉽도록 하자.
메모리 생성
UObject를 생성할 때는 NewObject<> 를 사용하자.
Actor를 생성할 때는 SpawnActor<> 를 사용하자.
메모리 해제
UObject 강제 메모리 해제 : UObject::ConditionalBeginDestroy() 함수 호출.(이 후 BeginDestory/FinishDestory 가 호출된다)
*다른 객제가 참조하고 있을 경우엔 호출하지 않을 것.(참조 카운트를 확인하지 않고 무조건적으로 객체를 파괴하기 때문에 dangling pointer가 생길 수 있다)
스마트 포인터 사용
UObject 파생 클래스들은 이미 참조 카운트 방식이기 때문에 TSharedPtr, TWeakPtr을 사용할 수 없다.
UC++이 아닌 C++ New 키워드로 동적으로 할단된 객체에는 TSharedPtr, TWeakPtr을 사용할 수 있다.
- TSharedPtr : 스레드로부터 안전한 (ESPMode::ThreadSafe를 인자로 넘긴다면) 참조 카운트 포인터 타입.
참조 카운트가 없을 때 할당 해제 된다.
- TAutoPtr : 스레드로부터 안전하지 않은 공유 포인터
- TSharedRef : null이 불가능한 TSharedPtr. TSharedPtr로 변환이 가능하다.
- TUniquePtr : 1:1 소유권을 가지는 포인터. 포인터를 명시적으로 소유하며 공유할 수 없다.
- TWeakPtr : 참조하는 객체를 소유하지 않기 때문에, 생명주기에 영향을 주지 않는다.
사전 경고 없이 null이 될 수 있으며 객체에 대한 일시적인 안전한 접근을 제공한다.
SharedPtr의 순환참조 문제 또한 해결 가능하다.
- TScopedPointer : 스코프(블록)의 끝에서 자동 삭제되는 포인터.
가비지 컬렉션(GC) 강제 실행
메모리의 일부를 수동으로 비우고 싶을 때 ForceGarbageCollention(true); 로 강제 실행 가능하다.
*매우 큰 텍스처를 사용하지 않을 때(?) 같은 경우..
참고..
오브젝트 리스트를 보여주는 UI 가 있다고 하면 이 경우에 UI에서는 TWeakObjectPtr을 사용해서 보여주는 게 맞다고함.
그냥 포인터를 받아오게 되면 UI가 켜진 상태에서는 오브젝트들이 사라질 수 없음.
기본 int, float, bool 등의 타입은 아무것도 안해도 됨.
TArray<>는 컨테이너들 중 유일하게 UObject*(UPROPERTY 지정된)를 안전하게 담을 수 있음.
'::protected > 언리얼4&5' 카테고리의 다른 글
콘솔 명령어 / 콘솔 변수 (0) | 2023.06.29 |
---|---|
Niagara.. (0) | 2023.06.27 |
작업 중 기억해둘 것들(update). (0) | 2022.08.04 |
데이터 사용하기. (0) | 2022.06.21 |
AI (0) | 2020.11.18 |