Replication Graph 기초
대규모 멀티플레이어 최적화를 위한 Replication Graph 시스템
Replication Graph란?
Fortnite Battle Royale에서 검증된 최적화 시스템
Fortnite Battle Royale은 100명의 플레이어와 약 50,000개의 복제 Actor로 시작합니다. Replication Graph는 이러한 대규모 환경에서 효율적인 복제를 위해 개발되었습니다.
활성화 방법
// Replication Graph 활성화
[/Script/OnlineSubsystemUtils.IpNetDriver]
ReplicationDriverClassName="/Script/MyGame.MyReplicationGraph"
기본 구조
UReplicationGraph 클래스 구현
UCLASS()
class UMyReplicationGraph : public UReplicationGraph
{
GENERATED_BODY()
public:
// Actor 클래스별 기본 설정
virtual void InitGlobalActorClassSettings() override;
// 전역 노드 초기화
virtual void InitGlobalGraphNodes() override;
// 연결별 노드 초기화
virtual void InitConnectionGraphNodes(
UNetReplicationGraphConnection* ConnectionManager) override;
// Actor를 적절한 노드로 라우팅
virtual void RouteAddNetworkActorToNodes(
const FNewReplicatedActorInfo& ActorInfo,
FGlobalActorReplicationInfo& GlobalInfo) override;
virtual void RouteRemoveNetworkActorToNodes(
const FNewReplicatedActorInfo& ActorInfo) override;
protected:
// 항상 관련있는 Actor 노드
UPROPERTY()
UReplicationGraphNode_AlwaysRelevant* AlwaysRelevantNode;
// 공간 분할 노드
UPROPERTY()
UReplicationGraphNode_GridSpatialization2D* GridNode;
};
주요 노드 타입
빌트인 Replication Graph 노드
AlwaysRelevant
GameState, GameMode 등 모든 클라이언트에 항상 복제되어야 하는 Actor
AlwaysRelevant_ForConnection
PlayerState, PlayerController 등 특정 연결에만 항상 관련있는 Actor
GridSpatialization2D
2D 그리드 기반 공간 분할, 거리에 따른 관련성 결정
DormancyNode
상호작용 전까지 휴면 상태인 Actor 관리
Actor 라우팅
Actor를 적절한 노드에 배치
void UMyReplicationGraph::RouteAddNetworkActorToNodes(
const FNewReplicatedActorInfo& ActorInfo,
FGlobalActorReplicationInfo& GlobalInfo)
{
// PlayerState는 항상 관련있음
if (ActorInfo.Class->IsChildOf(APlayerState::StaticClass()))
{
AlwaysRelevantNode->NotifyAddNetworkActor(ActorInfo);
return;
}
// bAlwaysRelevant 플래그 체크
if (ActorInfo.Actor->bAlwaysRelevant)
{
AlwaysRelevantNode->NotifyAddNetworkActor(ActorInfo);
return;
}
// 일반 Actor는 공간 분할 노드로
GridNode->NotifyAddNetworkActor(ActorInfo);
}
InitGlobalActorClassSettings에서 클래스별 기본 동작을 정의하면 RouteAddNetworkActorToNodes가 더 깔끔해집니다.
핵심 요약
- Replication Graph - Fortnite에서 검증된 대규모 멀티플레이어 최적화 시스템
- 노드 구조 - AlwaysRelevant, GridSpatialization2D, DormancyNode 등
- 라우팅 - RouteAddNetworkActorToNodes에서 Actor를 적절한 노드에 배치
- Iris와 상호 배타적 - Replication Graph와 Iris는 동시 사용 불가
도전 과제
배운 내용을 직접 실습해보세요
UReplicationGraph를 상속한 클래스를 생성하고, DefaultEngine.ini에서 ReplicationDriverClassName을 설정하세요. InitGlobalGraphNodes에서 AlwaysRelevantNode와 GridSpatialization2D 노드를 생성하세요.
RouteAddNetworkActorToNodes를 오버라이드하여 APlayerState는 AlwaysRelevant로, ACharacter는 GridNode로, bAlwaysRelevant Actor는 AlwaysRelevant로 분배하는 로직을 구현하세요.
50명 봇 테스트 환경에서 Replication Graph 유무에 따른 서버 성능을 비교하세요. stat net으로 복제 Actor 수, 대역폭, 서버 FPS를 측정하고, InitGlobalActorClassSettings에서 클래스별 ReplicationPeriodFrame을 튜닝하여 최적화하세요.