관리 메뉴

KoreanFoodie's Study

언리얼 스마트 포인터 (Unreal Smart Pointer) 본문

Game Dev/Unreal C++ : Study

언리얼 스마트 포인터 (Unreal Smart Pointer)

머니덕 2022. 4. 1. 13:44

스마트 포인터 3대장

C++ 에는 대표적인 스마트 포인터 3 가지가 있는데, 언리얼에서는 이를 T로 시작하는 라이브러리로 제공한다.

 

  1. TUniquePtr
  2. TSharedPtr
  3. TWeakPointer

기본적인 원리와 기능은 C++ 와 비슷하다. 기본적인 메서드 차이만 잠깐 짚고 넘어가면,

  • TUniquePtr : C++ 에서 std::move 를 이용해 소유권을 이전했다면, 언리얼에서는 MoveTemp 를 사용한다.
  • TSharedPtr : C++ 에서 maked_shared 를 이용했다면, 언리얼에서는 MakeShareable 을 사용한다. 해제 시 Reset( ) 을 호출한다.

 

 

언리얼 오브젝트의 메모리관리

위의 스마트 포인터 라이브러리는 일반 C++ 객체를 위한 라이브러리이고, 언리얼 오브젝트에는 사용할 수 없다. UPROPERTY 가 붙은 언리얼 오브젝트는 가비지 컬렉터(GC)에 의해 자동으로 관리되기 때문이다.

언리얼의 GC 에 의해 메모리가 해제될 경우, C++ 의 스마트 포인터 라이브러리와 달리 해제되는 시점을 정확히 예측할 수 없다. 따라서 언리얼 오브젝트의 포인터를 소멸할 때에는 BeginConditionalDestroy( ) 라는 함수를 호출하고 해제가 될 때까지 기다려야 한다(액터의 경우에는 DestroyActor 함수도 호출해 월드의 씬 정보를 업데이트 해 주어야 한다).

가비지 컬렉션은 프로젝트 세팅에서 지정된 시간마다 돌아가도록 설정되어 있는데, "Time Between Pruging Pending Kill Objects" 옵션을 조정하면 간격을 더 짧게 조정할 수 있다.

 

 

언리얼 오브젝트의 약포인터

언리얼 C++ 에서는 언리얼 오브젝트를 약참조하는 TWeakObjectPtr 이라는 별도의 라이브러리를 제공한다. 특정 오브젝트를 참조할 때 반드시 소유권이 필요하지 않은 경우에는 약참조를 걸어 놓는 것이 바람직한 방식이다.

예를 들어, 인벤토리 시스템에서 아이템을 가리킬 때, 약참조가 아닌 공유참조를 걸어 놓으면, 아이템이 사라진 후에도 레퍼런스 카운팅이 0이 되지 않아 아이템 객체의 메모리가 회수되지 않을 수 있다!

0 Comments
댓글쓰기 폼