PART 2 - 강의 1/3

Replication Graph 기초

대규모 멀티플레이어 최적화를 위한 Replication Graph 시스템

01

Replication Graph란?

Fortnite Battle Royale에서 검증된 최적화 시스템

배경

Fortnite Battle Royale은 100명의 플레이어와 약 50,000개의 복제 Actor로 시작합니다. Replication Graph는 이러한 대규모 환경에서 효율적인 복제를 위해 개발되었습니다.

활성화 방법

DefaultEngine.ini // Replication Graph 활성화 [/Script/OnlineSubsystemUtils.IpNetDriver] ReplicationDriverClassName="/Script/MyGame.MyReplicationGraph"
02

기본 구조

UReplicationGraph 클래스 구현

C++ 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; };
03

주요 노드 타입

빌트인 Replication Graph 노드

AlwaysRelevant

GameState, GameMode 등 모든 클라이언트에 항상 복제되어야 하는 Actor

AlwaysRelevant_ForConnection

PlayerState, PlayerController 등 특정 연결에만 항상 관련있는 Actor

GridSpatialization2D

2D 그리드 기반 공간 분할, 거리에 따른 관련성 결정

DormancyNode

상호작용 전까지 휴면 상태인 Actor 관리

04

Actor 라우팅

Actor를 적절한 노드에 배치

C++ 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가 더 깔끔해집니다.

SUMMARY

핵심 요약

  • Replication Graph - Fortnite에서 검증된 대규모 멀티플레이어 최적화 시스템
  • 노드 구조 - AlwaysRelevant, GridSpatialization2D, DormancyNode 등
  • 라우팅 - RouteAddNetworkActorToNodes에서 Actor를 적절한 노드에 배치
  • Iris와 상호 배타적 - Replication Graph와 Iris는 동시 사용 불가
PRACTICE

도전 과제

배운 내용을 직접 실습해보세요

실습 1: 기본 Replication Graph 설정

UReplicationGraph를 상속한 클래스를 생성하고, DefaultEngine.ini에서 ReplicationDriverClassName을 설정하세요. InitGlobalGraphNodes에서 AlwaysRelevantNode와 GridSpatialization2D 노드를 생성하세요.

실습 2: Actor 라우팅 구현

RouteAddNetworkActorToNodes를 오버라이드하여 APlayerState는 AlwaysRelevant로, ACharacter는 GridNode로, bAlwaysRelevant Actor는 AlwaysRelevant로 분배하는 로직을 구현하세요.

심화 과제

50명 봇 테스트 환경에서 Replication Graph 유무에 따른 서버 성능을 비교하세요. stat net으로 복제 Actor 수, 대역폭, 서버 FPS를 측정하고, InitGlobalActorClassSettings에서 클래스별 ReplicationPeriodFrame을 튜닝하여 최적화하세요.