게임 개발/Unreal Engine 기본

[UE4] 액터의 수명 주기, 가비지 콜렉터

지노윈 2022. 2. 10. 15:00
반응형

액터의 수명 주기


액터의 생명 주기에 대해서 이해를 하고 있어야 겠습니다.

 

이 문서는 액터의 수명 주기에 대한 일반적 개요서로, 액터가 레벨에 어떻게 인스턴스가 생성 (Spawn) 되고 소멸 (Destroy) 되는지에 대해서입니다.

https://docs.unrealengine.com/4.27/ko/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/Objects/Optimizations/

 

언리얼 오브젝트 처리

UObject 시스템의 기능에 대한 개요입니다.

docs.unrealengine.com

 

가비지 콜렉터


언리얼 엔진은 자체 스마트 포인터를 제공하며 이를 통해 자동으로 가비지 콜렉션을 수행합니다.

[게임 개발/Unreal Engine 기본] - [UE4] 스마트포인터 - TSharedPtr, TWeakPtr, TUniquePtr

 

가비지 콜렉션 수행 주건

  • UObject 파생 클래스의 멤버 변수는 UPROPERTY 매크로 선언
  • 네이티브 클래스의 경우TSharedPtr, TSharedRef, TUniquePtr로 멤버 변수를 선언
  • 댕글링 포인터 문제나 공유 포인터 순환 참조 문제를 피하기 위해서는 TWeakPtr 사용, UObject의 경우 TWeakObjectPtr 사용
  • UObjectBaseUtility::AddToRoot 또는 UObjectBaseUtility::SetFlags(EObjectFlag::RF_MarkAsRootSet) 수행시 GC 제외

오드젝트 소멸시점에 다음과 같은 코드를 작성하여 GC 수집 대상으로 포함시킬 수 있습니다. 그렇지만 당연히 다른 공유 포인터가 없어서 참조 카운트가 0 이여야 메모리 해제가 됩니다.

if (!ptr)return;
if (!ptr->IsValidLowLevel()) return;
ptr->ConditionalBeginDestroy();
ptr = nullptr;	// 참조 카운트 리셋, ptr->Reset()도 동일합니다.

ForceGarbageCollection 함수를 하출하여 다음 프레임에 GC감지를 트리거합니다.

/** Updates the timer between garbage collection such that at the next opportunity garbage collection will be run. */
// void ForceGarbageCollection(bool bFullPurge = false);
GEngine->ForceGarbageCollection();

bFullPurge를 true로 설정하면 이 프레임의 모든 GC 오브젝트를 채웁니다. 이 접근 방식은 불규칙한 프레임 속도를 유발할 수 있지만 메모리가 부족할 때 유용합니다.