* 정의
Actor가 로드되거나 스폰되고, 소멸할 때까지의 과정을 Actor 생명주기(Actor Lifecycle)라고 한다.
* 동작 방식
세부 내용은 여기서 확인하면 된다.
Actor Lifecycle
What actually happens when an Actor is loaded or spawned, and eventually dies.
docs.unrealengine.com
- 간단 과정
생명주기를 간단하게 표현하면 다음과 같다.
- Actor가 로드되거나 스폰
- BeginPlay
- Tick이나 다른 동작
- 소멸될 조건을 달성(Destroy 호출, 지정한 시간 초과, 게임 종료 등)
- EndPlay
- Actor에 RF_PendingKill 마킹
- Actor들의 ULevel 배열에서 해당 Actor 제거
- 다음 가비지 컬렉션 사이클에서 할당 해제
- BeginDestroy
- IsReadyForFinishDestroy
- 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을 사용하게 되면 로드되는 객체와 참조되는 객체의 클러스터가 병합된다. 게임과 같은 컨텐츠 스트리밍과 같은 대부분의 경우 다수의 클러스터가 병합되기 때문에 큰 클러스터가 하나 남아서 삭제되지 않고 기다릴 가능성이 높다. 하지만 다른 객체에 공유되지 않는 참조되는 객체의 경우에 개별 객체에 대한 검사가 줄어들어 성능향상을 기대할 수 있다.
'게임 엔진 > Unreal Engine' 카테고리의 다른 글
| [UnrealEngine] 리플렉션(Unreal Property System (Reflection)) (0) | 2022.03.29 |
|---|---|
| [UnrealEngine] 스마트 포인터(Smart Pointer) (0) | 2022.03.28 |
| [UnrealEngine] Tick (0) | 2022.03.28 |
| [UnrealEngine] ActorComponent (0) | 2022.03.26 |
| [UnrealEngine] Actor (0) | 2022.03.24 |