[UnrealEngine 5] 멀티플레이 최적화 : NetUpdateFrequency와 클라이언트 보간

2026. 3. 24. 19:32·프로그래밍/Unreal Engine 5

개요

멀티플레이어 환경에서 액터의 트랜스폼(위치, 회전)을 서버와 클라이언트 간에 동기화할 때, 매 틱(Tick)마다 데이터를 주고받는 것은 심각한 네트워크 부하를 초래한다. 이를 해결하기 위해 언리얼 엔진에서 제공하는 레플리케이션 빈도 조절 속성인 NetUpdateFrequency의 개념을 이해하고, 빈도가 낮아져서 뚝뚝 끊기는 움직임을 클라이언트 측에서 부드럽게 처리하는 보간(Interpolation) 기법을 정리해 본다.


1. NetUpdateFrequency란 무엇인가?

NetUpdateFrequency는 해당 액터가 1초당 최대 몇 번 레플리케이션(네트워크 동기화)을 시도할지 지정하는 속성이다.

  • 최대치 보장의 원리: 이 값은 '최대치'일 뿐, 항상 이 빈도로 레플리케이션 됨을 보장하지는 않는다. 실제 레플리케이션은 서버의 Tick Rate와 성능에 따라 유동적으로 결정되며, 서버 성능이 낮으면 이 값보다 더 적게 복제될 수도 있다.
  • 데디케이티드 서버의 이점: 그래픽 렌더링을 하지 않는 데디케이티드 서버는 성능 자원을 온전히 연산에 쏟을 수 있어 더 안정적인 레플리케이션 성능을 발휘한다.

주요 액터들의 기본 NetUpdateFrequency 값

엔진에 설정된 기본값들은 각 액터의 중요도에 따라 다르게 세팅되어 있다.

  • Actor, Pawn, PlayerController: 100 (이론상 1/100초 간격으로 매우 자주 동기화)
  • GameState: 10
  • PlayerState: 1 (1초에 단 1번만 동기화하여 부하를 대폭 줄임)

2. 네트워크 부하를 줄이는 2가지 접근법

서버와 클라이언트의 위치를 동기화할 때 주로 두 가지 방식을 고려할 수 있다.

  1. 매 틱(Tick)마다 동기화: 서버의 위치를 매 프레임 클라이언트에게 쏴주는 방식. 구현은 쉽지만 트래픽 낭비가 극심하다.
  2. 낮은 빈도 + 클라이언트 예측/보간 (권장): 서버는 아주 가끔씩(예: 1초에 1번)만 기준 위치와 속도 값을 보내고, 클라이언트가 그 사이의 움직임을 계산(Lerp)하여 부드럽게 이어주는 방식이다.

3. C++ 클라이언트 보간(Interpolation) 구현 실습

NetUpdateFrequency를 낮춰서 네트워크 부하를 줄인 뒤, 클라이언트에서 뚝뚝 끊기는 회전을 FMath::Lerp를 이용해 부드럽게 보간하는 C++ 코드 로직이다.

① 변수 선언 (Header)

// DXBox.h
protected:
    // 레플리케이션 주기 (1 / 주파수)
    float NetUpdatePeriod;
    // 마지막으로 동기화된 이후 흐른 시간
    float AccDeltaSecondSinceReplicated;

② 주파수 낮추기 및 주기 계산 (Constructor)

// DXBox.cpp
ADXBox::ADXBox() : AccDeltaSecondSinceReplicated(0.0f)
{
    // 1초에 딱 1번만 레플리케이션 하도록 주파수를 확 낮춤!
    const static float BoxActorNetUpdateFrequency = 1.0f;
    SetNetUpdateFrequency(BoxActorNetUpdateFrequency);

    // 업데이트 주기 계산 (주기 = 1 / 주파수)
    NetUpdatePeriod = BoxActorNetUpdateFrequency / GetNetUpdateFrequency();
}

③ 클라이언트 측 Tick에서 부드럽게 보간하기

// DXBox.cpp
void ADXBox::Tick(float DeltaSeconds)
{
    Super::Tick(DeltaSeconds);

    if (!HasAuthority()) // 클라이언트에서만 실행
    {
        if (NetUpdatePeriod < KINDA_SMALL_NUMBER) return;

        // 1. 시간 누적
        AccDeltaSecondSinceReplicated += DeltaSeconds;

        // 2. 보간 비율(Alpha) 계산 (0.0 ~ 1.0 사이로 Clamp)
        const float LerpRatio = FMath::Clamp(AccDeltaSecondSinceReplicated / NetUpdatePeriod, 0.f, 1.f);

        // 3. 서버의 다음 예상 위치(회전값) 도출
        const float NextServerRotationYaw = ServerRotationYaw + RotationSpeed * NetUpdatePeriod;

        // 4. 현재 서버 위치와 다음 예상 위치 사이를 부드럽게 보간(Lerp)
        const float EstimatedClientRotationYaw = FMath::Lerp(ServerRotationYaw, NextServerRotationYaw, LerpRatio);

        // 5. 클라이언트 화면의 액터에 적용
        SetActorRotation(FRotator(0.f, EstimatedClientRotationYaw, 0.f));
    }
}

④ OnRep 함수에서 누적 시간 초기화

서버로부터 새로운 동기화 데이터가 도착(OnRep 실행)하면, 다시 0초부터 보간을 시작해야 하므로 누적 시간을 리셋한다.

// DXBox.cpp
void ADXBox::OnRep_ServerRotationYaw()
{
    // 데이터가 도착했으니 흐른 시간을 다시 0으로 초기화
    AccDeltaSecondSinceReplicated = 0.0f;
}

'프로그래밍 > Unreal Engine 5' 카테고리의 다른 글

[Unreal Engine 5] 언리얼 엔진의 포인터 안전성 검사: Null 체크 vs IsValid vs C++17  (0) 2026.03.27
[Unreal Engine5] 멀티플레이 최적화 Relevancy, NetPriority, NetDormancy의 이해  (0) 2026.03.25
[Unreal Engine] 프로퍼티 레플리케이션 심화: NetLoadOnClient와 RepNotify(OnRep) 이해  (0) 2026.03.23
[Unreal Engine 5] Property Replication  (0) 2026.03.20
[Unreal Engine 5] Remote Procedure Call 기초  (0) 2026.03.18
'프로그래밍/Unreal Engine 5' 카테고리의 다른 글
  • [Unreal Engine 5] 언리얼 엔진의 포인터 안전성 검사: Null 체크 vs IsValid vs C++17
  • [Unreal Engine5] 멀티플레이 최적화 Relevancy, NetPriority, NetDormancy의 이해
  • [Unreal Engine] 프로퍼티 레플리케이션 심화: NetLoadOnClient와 RepNotify(OnRep) 이해
  • [Unreal Engine 5] Property Replication
hanong8
hanong8
hanong8 님의 블로그 입니다.
  • hanong8
    HaNong
    hanong8
  • 전체
    오늘
    어제
    • 분류 전체보기 (102) N
      • 프로그래밍 (99) N
        • Unreal Engine 5 (45)
        • C++ (22)
        • UML (2)
        • 자료구조 (2)
        • 알고리즘 (9)
        • 개발일지 (4)
        • DirectX11 (5)
        • Git (2)
        • 코드카타 (8) N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
hanong8
[UnrealEngine 5] 멀티플레이 최적화 : NetUpdateFrequency와 클라이언트 보간
상단으로

티스토리툴바