언리얼엔진/블루프린트

엑터의 라이프 사이클, 소멸과 가비지컬렉션

season97 2023. 10. 8. 16:25

언리얼에서 오브젝트에게 디스트로이를 날리면?

충돌 시 게임에서 삭제

ㆍ 디스트로이를 날렸다고 해서 바로 실제로 삭제되는 것이 아닌 가비지컬렉션(Garbage Collection)이 오기를 기다리는 킬 대기 상태가 된다.

└ 이 말은 즉 메모리엔 남아있고 레벨뷰에서만 제거가 된다는 소리다.

 

ㆍ 별다른 설정을 안했다면 1분에한번씩 가비지컬렉션이 돌게 설정되어 있다.

가비지 컬렉션 기본 설정

 

▶ 엑터의 라이프사이클 (Actor LifeCycle)과 삭제

 

1. 생성

 

ㆍ Actor를 새로 생성할 땐 일반적으로 SpawnActor 함수를 사용.

 

ㆍ SpawnActor함수는 클래스 타입과 초기위치, 회전값을 인자로 받아 새 Actor를 메모리에 할당하고 초기화 함

스폰관련 다양한 함수들

※ 출처 https://docs.unrealengine.com/5.1/ko/unreal-engine-actor-lifecycle/

 

=== 생성...초기화...틱 등 각자 작업 수행 ===

 

2. 삭제

 

ㆍ Actor를 삭제하기 위해선 Destroy를 호출한다.

 

ㆍ 이 메서드가 호출되면 해당 Actor는 더 이상 유효하지 않게 되며 아무기능도 하지 않지만 실제 메모리 해제는 되지 않은채로 가비지 컬렉션을 기다린다.

 

★ 2 - 1 Actor의 삭제 과정

 

- 1. Destroy 호출 (해제, P.K상태)

 

ㆍ 해당 Actor는 더이상 유효하지 않다. 그러나 실제 메모리에선 즉시 해제되지 않는다.

 

ㆍ 이 시점부터 해당 Actor는 '삭제 대기 상태'에 들어간다 

 

가비지 컬렉션 Begin

ㆍ 내부적으로 BeginDestroy 가 돌며 소멸하기 시작함. 여기서 우리는 오브젝트 메모리를 해제하고 멀테스레드 리소스를 처리하는 등의 작업을 할 수 있다.

 

- 2. 마크업 (Marked for deletion)

 

Destroy 메서드가 호출된 후 해당 Actor를 '삭제 대상'으로 표시(Mark)한다.

 

ㆍ 이렇게 표시된 오브젝트들은 가비지 컬렉션 과정에서 실제 메모리에서 제거될 수 있다.

 

※ 가비지 컬렉션 소멸 마무리 준비

ㆍ  가비지컬렉션 프로세스는 IsReadyForFinishDestroy 함수를 호출하여 오브젝트가 완전히 삭제될 준비가 되었는지 확인함. 만약 false를 반환한다면 해당 오브젝트의 삭제 작업은 다음 가비지컬렉션까지 유예된다.

 

- 3. 가비지 컬렉션

 

ㆍ 일정 주기로 동작하여 삭제 대상으로 표시된 오브젝트를 찾아내고 메모리에서 해제한다.

 

※ 가비지컬렉션 소멸마무리

ㆍ  FinishDestroy 함수가 호출되며 오브젝트 내부 데이터 구조체를 해제하는 마지막 기회가 주어짐. 메모리 해제 이전 마지막 호출

 

3. 종료

 

ㆍ EndPlay

 

플레이가 끝났기에 GC를 바로 호출해 메모리를 싹 밀어준다.

 

 

◈ 가비지 컬렉션이란?

 

ㆍ 더 이상 사용되지 않는 메모리를 자동으로 해제하는 프로세스를 말한다. 

 

ㆍ CPU를 소모하므로 너무 자주 호출하면 성능에 부정적 영향을 줄 수 있으므로 적절한 타이밍과 주기로 관리해야 함.

 

ㆍ Destroy가 호출된 후와 가비지 컬렉션이 돌기 사이의 시간도 Actor는 메모리를 차지하고 있으므로 많은 수의 오브젝트를 빠르게 생성하고 파괴하는 경우 메모리에 부담을 줄 수 있음. 

 

ㆍ 위에서 언급한거처럼 Begin -> IsReadyForFinishDestroy -> FinishDestroy 순으로 진행됨