언리얼에선 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

+ Recent posts