본문 바로가기
프로그래밍/Unreal 부트캠프

TIL 2025.03.21 기록

by Rozentea 2025. 3. 21.

0. 개요


어제는 예비군 훈련을 다녀와서 면접준비 및 네트워크 강의를 이어서 들었고, 오늘은 네트워크 강의를 들었다.

어제는 7시에 예비군이 끝나서.. 공부하다보니 너무 피곤해 TIL 작성을 못했다.. ㅠ

때문에 어제 내용까지 조금 포함해서 TIL을 작성하고 마저 네트워크 강의를 들어야 할 것 같다.

 

지금.. 커넥션과 오너십에 대해서 듣긴했는데, 주말까지 RPC에 대한 내용까지 모두 강의를 듣고 공부하는걸 목표로 해야할 것 같다.

 

1. 면접 준비


 

1. vector의 erase와 remove의 차이

Vector의 erase는iterator를 받아 컨테이너의 해당 공간의 요소를 삭제하고, size를 줄여준다. (capacity는 줄지 않는다.)

이때 삭제된 곳의 뒷쪽 원소들을 한칸씩 당겨준다.

또 erase는 vector의 내부 함수이다.

 

remove의 경우 범위를 탐색해 그 곳의 요소를 덮어씌워 삭제된 것 처럼 보이도록 해주는데, 정확히는 지워야할 해당 인덱스 뒤 쪽의 모든 요소를 앞으로 당겨오고, 가장 뒤의 요소는 그대로 남아 중복된 값이 생기게된다.

이후에는 해당 중복된 요소의 iterator를 잔환해준다.

이런 이유 때문에 size와 capacity는 줄지 않는다.

remove는 algorithm에 구현되어 있는 함수이다.

 

remove는 원하는 요소 값을 기준으로 삭제가 가능하지만 결국 중복된 값이 생겨버리는게 문제이고, earse는 iterator를 기준으로 지워지기 때문에 값을 기준으로 지우지는 못하는 단점이 있다.

때문에 두가지를 혼용해 사용하는 방법도 좋은 방법이다.

 

2. Actor의 생애주기에 대해 설명해주세요.

Play in Editor

  1. Editor에 있는 Actor들은 New World로 복사되고 UObject의 PostDuplicate가 호출된다.
  2. Actor들이 GamePlay를 시작하기 위해 World에 의해 UAISystemBase의 InitializeActorsForPlay가 호출된다.
  3. 초기화되지 않은 Actor에 ULevel의 RouteActorInitialize를 호출한다.
    1. AActor::PreInitializeComponents -> UActorComponent::InitalizeComponent -> AActor::PostInitializeComponents
  4. 레벨이 시작되었다는 AActor의 BeginPlay를 호출한다.

[ 정리 ]

Editor를 실행하면, 액터 클래스의 생성자가 한번 호출된다.

이는 CDO와 관련이 있는데, 언리얼 엔진의 UObject는 Default Object인 기본 세팅으로 초기화 된 CDO를 미리 만들어 두고 이를 복사하는 방식으로 다른 Instance를 만든다.

또, Drag&Drop을 할때, Drag에서 생성자가 한번, Drop을 할때, 다른 Instance가 만들어져 생성자가 한번 더 호출된다.

(이는 Preview Asset과 배치한 Asset이 다르기 때문이다.)

위 정리대로

생성자 → PostDuplicate → AActor::PreInitializeComponents→ UActorComponent::InitalizeComponent → AActor::PostInitializeComponents → BeginPlay 순으로 실행된다.

음 어쨌건.. Editor에서 Play가 되면, 액터들이 새로운 World로 복사되어 생성되는 과정에서도 위 과정들을 거치는 것.

 

Load from Disk

이미 레벨에 있는 Actor에 대해 발생

LoadMap 또는 동적으로 맵의 일부분을 로드하고 언로드하는 레벨스트리밍에서 UWorld::AddToWorld를 호출할 때 발생함.

패키지/레벨에 있는 Actor가 Disk에서 로드되고 PostLoad를 호출함.

이후의 전체적인 흐름은 Play in Editor와 유사

 

Spawn & Deferred Spawn

Level에 Actor를 SpawnActor로 Spawn할 때의 Lifecycle이다.

  1. SpawnActor 호출
  2. AActor::PostSpawnInitialize를 호출
  3. Spawn된 Actor의 생성 이후 AActor::PostActorCreated를 호출. 생성자와 관련된 구현을 담는 함수로 PostLoad와 배타적이다.
  4. AActor::ExecuteConstruction → AActor::OnConstruction → AActor::PostInitializeComponents

AActor::OnConstruction는 블루프린트 Actor의 컴포넌트 생성, 변수 초기화 시점이다. 5. Actor의 Component 초기화 1. AActor::PreInitializeComponents -> UActorComponent::InitalizeComponent -> AActor::PostInitializeComponents 6. UWorld::OnActorSpawned로 Delegate Broadcast 이후 AActor::BeginPlay 호출

DeferredSpawn은 Spawn과 비슷하지만, PostActorCreated 이후 블루프린트 Construction 전에 초기화 함수를 구성한 뒤 AActor::FinishingSpawning을 호출하여 Spawn을 마무리하는 형태이다.

변수의 초기화 값의 변경이 동적으로 필요한 Actor를 Spawn할 때 유용하다.

 

End of Actor Lifecycle

Destroy, LifeTime 종료, Level Transition, Play in Editor 종료, Game End, Application Closing에 의해 EndPlay가 호출된다.

그러면 Actor는 RF_PendingKill로 마킹된다.

이후 ULevel의 Actor Array에서 해당 Actor는 제거되고 다음 garbage collection cycle에 마킹된 Actor의 메모리를 할당해제 한다.

garbage collection의 과정에서 UObject::BeginDestroy, UObject::IsReadyForFinishDestroy, UObject::FinishDestroy의 함수가 추가로 호출된다.

UObject::IsReadyForFinishDestroy는 준비가 되지 않았다면 다음 cycle로 유예해 다시 진행한다.

 

2. 마무리


네트워크 관련은 지금 강의듣고 필기만 쭉하고 있어서 내일쯤에 한번 다시 정리해보고 글을 작성하려 한다..

다행히 이제 언리얼 네트워크가 어떻게 돌아가는지 조금씩 이해가 되고 있어서 다행인 것 같다.

'프로그래밍 > Unreal 부트캠프' 카테고리의 다른 글

TIL 2025.03.25 기록  (0) 2025.03.25
TIL 2025.03.24 기록  (0) 2025.03.24
TIL 2025.03.19 기록  (0) 2025.03.19
TIL 2025.03.18 기록  (0) 2025.03.18
TIL 2025.03.17 기록  (0) 2025.03.17