* 정의

 

Actor가 로드되거나 스폰되고, 소멸할 때까지의 과정을 Actor 생명주기(Actor Lifecycle)라고 한다.

 

 

* 동작 방식

 

세부 내용은 여기서 확인하면 된다.

https://docs.unrealengine.com/4.27/en-US/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/Actors/ActorLifecycle/

 

Actor Lifecycle

What actually happens when an Actor is loaded or spawned, and eventually dies.

docs.unrealengine.com

 

 

- 간단 과정

 

생명주기를 간단하게 표현하면 다음과 같다.

 

  1. Actor가 로드되거나 스폰
  2. BeginPlay
  3. Tick이나 다른 동작
  4. 소멸될 조건을 달성(Destroy 호출, 지정한 시간 초과, 게임 종료 등)
  5. EndPlay
  6. Actor에 RF_PendingKill 마킹
  7. Actor들의 ULevel 배열에서 해당 Actor 제거
  8. 다음 가비지 컬렉션 사이클에서 할당 해제
  9. BeginDestroy
  10. IsReadyForFinishDestroy
  11. FinishDestroy

 

 

간단한 함수 설명을 하면 다음과 같다.

 

@ BeginPlay : 에디터로 플레이하거나 디스크에서 로드될 때 레벨이 시작될 때 호출된다.

 

 @ Destroy : Actor가 제거되어야 할 때마다 수동으로 호출되며, 게임 플레이는 지속중인 상태라 즉시 제거하지 않는다. Actor에 PendingKill을 마킹하게 되고 이 후 레벨에서 삭제된다.

 

@ EndPlay : Actor의 수명이 끝났다는 것을 보장하기 위해 여러 곳에서 호출된다. 플레이 중 Destroy 함수를 호출하였거나 레벨이 변경되었을 때, 스트리밍 중인 레벨이 언로드 되었을 때 등 호출된다. 간단히 정리해보면 다음과 같다.

  • Destroy 호출
  • Editor에서 플레이 종료
  • 레벨 전이
  • 스트리밍 레벨 언로드
  • Actor의 생명시간 만료
  • 프로그램 종료

어떤 과정을 거치든 RF_PendingKill이 마킹되기 때문에 다음 가비지 컬렉션 사이클 때 할당 해제된다. FWeakObjectPtr<AActor>를 활용하여 삭제된 Actor에 대해 안전하게 처리할 수 있다.

 

 

- 가비지 컬렉션(Garbage Collection)

 

위에서 설명한 것과 같이 객체가 RF_PendingKill이 마킹되면 다음 가비지 컬렉션 사이클 때 할당 해제된다. 객체가 소멸되는 동안 다음과 같은 함수를 호출하게 된다.

 

@ BeginDestroy : 게임 플레이 기능과 관련된 것들은 EndPlay에서 더 일찍 처리되어야 한다. 여기서는 메모리를 확보하고 멀티스레드 자원을 처리할 수 있다.

 

@ IsReadyForFinishDestroy : 가비지 컬렉션 과정에서 이 함수를 호출하여 객체를 영구히 삭제해도 되는지 확인하는 용도로 사용된다. false를 반환함으로써 다음 가비지 컬렉션 사이클까지 객체의 실제 파괴를 연기할 수 있다.

 

@ FinishDestroy : 객체는 실제로 파괴되고 다른 데이터 구조를 해제할 수 있는 기회를 제공하는 것이다. 메모리가 해제되기 전에 마지막으로 호출되는 함수다.

 

 

- 가비지 컬렉션(Garbage Collection) 응용

 

기비지 컬렉션 과정에서 객체들을 클러스터링하여 함께 해제되도록 할 수 있는데, 이는 독립적인 객체를 삭제하는 것보다 시간과 전반적인 메모리 변동을 줄여준다. 객체와 서브객체를 한 클러스터로 묶으면 모든 객체가 해제 가능할 때까지 지연되며 한번에 할당 해제된다.

 

일반적으로 가비지 컬렉션은 건드리지 않지만 특수한 경우 클러스터링 설정을 변경하여 효율성을 높일 수 있다.

 

@ Clustering : 대부분 프로젝트에서 가비지 컬렉션의 효율성이 떨어지기 때문에 성능이 더 좋은 경우만 수행한다.

 

@ Clustering Merging : Clustering이 true인 경우 사용할 수 있는 옵션이다. 기본적으로는 활성화되어 있지 않다. 객체의 클러스터를 구축하는 과정에서 객체를 검사하고 다른 객체에 대한 참조를 찾을 수 있다. Clustering Merging을 사용하게 되면 로드되는 객체와 참조되는 객체의 클러스터가 병합된다. 게임과 같은 컨텐츠 스트리밍과 같은 대부분의 경우 다수의 클러스터가 병합되기 때문에 큰 클러스터가 하나 남아서 삭제되지 않고 기다릴 가능성이 높다. 하지만 다른 객체에 공유되지 않는 참조되는 객체의 경우에 개별 객체에 대한 검사가 줄어들어 성능향상을 기대할 수 있다.

 

 

+ Recent posts