언리얼 엔진 - 게임 프로젝트/AWS GameLift를 활용한 데디케이트 FPS 프로젝트

PlayerSession 처리 - 2) FastArraySerializer의 사용

monstro 2026. 7. 16. 11:44
728x90
반응형

- 개요

언리얼 엔진에서 효율적인 Replication을 위해 사용하는 FastArraySerializer를 추가한다

 

- FastArraySerializer란?

언리얼 엔진의 TArray 예시

 

언리얼 엔진에서 일반적인 TArray를 대상으로 Replication을 수행하는 경우 다음과 같은 문제가 발생한다

배열 안의 수많은 아이템 중에서 하나의 아이템이 변경되어도 전체 아이템을 패킷에 담아서 전송하는데,

이는 대역폭의 큰 낭비를 유발한다

 

언리얼 엔진의 FastArraySerializer 예시

 

이런 문제를 해결하는 것이 FastArraySerializer이다

FastArraySerializerItem 구조체를 사용하여 내부 아이템을 구성하는데, 

내부적으로 ReplicationIDReplicationKey와 같은 메타 데이터를 갖고 있어 엔진이 변경 사항을 추적할 수 있다

이후 메타 데이터의 변경 사항을 감지하여 FastArraySerializer에서 변경된 아이템만 Replicate한다

이런 방식을 통해 대역폭의 낭비를 방지할 수 있다

 

- 스크립트 작업

1) DedicatedServer.build.cs 파일

 

FastArraySerializer를 사용하기 위한 NetCore 모듈을 의존 관계에 추가한다

 

2) LobbyPlayerInfo 클래스

LobbyPlayerInfo 구조체

 

LobbyPlayerInfo 구조체를 추가한다 

해당 구조체는 FastArraySerializerItem 구조체로부터 상속되어 FastArraySerializer 안에 저장된다

2개의 생성자를 통해 객체를 생성할 수 있고

UserName 멤버변수를 사용하여 플레이어의 이름을 저장한다

 

LobbyPlayerInfoArray 구조체

 

LobbyPlayerInfoArray 구조체를 추가한다

해당 구조체는 FastArraySerializer 구조체에서 상속되어 데이터를 저장한다

Players 멤버변수를 사용하여 LobbyPlayerInfo 객체들을 저장한다

NetDeltaSerialize 함수를 추가하여 Replication이 되면 해당 함수를 호출하여

내부적으로 FastArrayDeltaSerialize 함수를 호출하고 변경된 데이터만 직렬화하여 전송하도록 설정한다

 

 

TStructOpsTypeTraits 템플릿 함수를 선언하여 변경된 데이터만 직렬화하여 전송할 수 있도록 설정한다

 

 

AddPlayer 함수를 위와 같이 정의한다

Players 멤버변수에 인자로 받은 LobbyPlayerInfo를 추가하고 인덱스를 가져온다

가져온 인덱스에 해당하는 아이템의 Dirty 플래그를 설정하여 변경 사항을 기록하고

PostReplicatedAdd 함수해당 인덱스의 아이템으로부터 호출하여 

클라이언트에서 데이터를 수신받은 후필요한 로직을 수행한다

 

 

RemovePlayer 함수를 위와 같이 정의한다

Players 멤버변수를 순회하면서 로직을 진행한다

순회중인 아이템이 인자로 받은 UserName과 동일하다

순회중인 아이템으로부터 PreReplicatedRemove 함수를 호출하여

서버에서 데이터가 제거된 후에 클라이언트에서도 동일하게 데이터를 제거하기 전에 필요한 로직을 수행한다

이후 RemoveAtSwap 함수를 호출하여 효율적으로 순회중인 아이템을 제거하고

MarkArrayDirty 함수를 호출하여 배열이 변경되었음을 기록한다

728x90
반응형