2025/03/19 Network Bandwidth 관리

초보 게임개발자·2025년 3월 19일

UnrealEngine

목록 보기
16/19

네트워크 Bandwidth(대역폭)이란?

Bandwidth(대역폭)는 네트워크가 1초 동안 전송할 수 있는 최대 데이터 양을 의미합니다.
즉, 얼마나 많은 정보를 동시에 보낼 수 있는가를 나타내는 개념입니다.

단위: bps (bits per second, 초당 비트 수)
예제:
100 Mbps (100 Megabits per second) → 초당 100Mb(메가비트) 데이터를 전송 가능
1 Gbps (1 Gigabit per second) → 초당 1Gb(기가비트) 전송 가능

왜 중요한가?

멀티플레이 게임에서는 서버와 클라이언트 간의 네트워크 트래픽을 최적화해야 함
✔ Bandwidth가 낮으면? → 데이터가 밀려서 지연(Latency) 발생
✔ Bandwidth가 너무 높으면? → 불필요한 데이터 전송으로 서버 부하 증가

즉, Bandwidth를 효율적으로 관리해야 네트워크 성능이 최적화됨!

최적화 하는방법

1. 압축(Compression) 사용하기

데이터를 전송할 때 압축하면 네트워크 부하를 줄일 수 있음
예제: JSON 대신 Binary Format 사용, zlib 압축 등

2. 불필요한 데이터 줄이기

Unreliable RPC 사용: 중요하지 않은 데이터는 손실을 허용하여 Bandwidth 절약
Net Cull Distance 설정: 일정 거리 이상 떨어진 액터는 업데이트 중단
Dormancy 사용: 변하지 않는 액터의 네트워크 동기화 중지

3. 패킷 크기 최적화

큰 데이터를 한 번에 보내기보다, 작은 패킷으로 쪼개서 전송
예: 움직임 데이터는 30FPS마다 보내는 대신, 중요한 순간만 전송

여기서 그럼 언리얼에서 네트워크를 효율적으로 관리할 수 있는 몇가지 기능들에대해서 소개해 드리겠습니다.

1. Actor Relevancy(액터 연관성)

Actor Relevancy는 서버가 어떤 액터(Actor)의 정보를 특정 클라이언트에게 전송할지 결정하는 메커니즘입니다.
즉, "이 플레이어에게 이 액터를 보여줄 필요가 있는가?"를 판단하는 기준이 됩니다.

사용하는 이유

  • 게임에서 모든 액터의 정보를 모든 플레이어에게 전송하면 네트워크 부하가 커짐
  • 불필요한 액터 정보를 보내지 않으면 서버 성능 최적화 및 네트워크 트래픽 절약 가능
  • 예를 들어, 플레이어가 너무 멀리 있는 NPC나 총알 정보는 받을 필요 없음

작동방식

서버는 각 클라이언트에 대해 어떤 액터가 "Relevant(연관됨)"한지 판단하여, 연관된 액터의 정보만 네트워크로 전송합니다.

  • 기본 조건 (UE5 기준)

  1. 월드 내에서 클라이언트와의 거리
    기본적으로 Net Cull Distance 설정에 따라 일정 거리 이상 벗어난 액터는 비활성화됨.
    예: 플레이어가 너무 멀리 있으면 해당 NPC 정보는 보내지 않음.

Net Cull Distance Squared 설정 (기본 거리 기반 필터링) -> 멀리 있는 액터 숨기기
액터가 일정 거리 이상 떨어지면 자동으로 네트워크 업데이트를 중지함.
멀리 있는 액터는 비활성화하여 네트워크 부하를 줄일 수 있음

  1. 팀 또는 시야(Visibility) 여부
    예: 적군의 위치는 미니맵에서 보이지 않지만, 같은 팀원은 보이도록 설정 가능.

  2. 특정 조건을 만족하는 경우
    예: 미션을 수행해야 나타나는 액터, 특정 이벤트 발생 시만 보이는 액터 등.

AActor::IsNetRelevantFor 오버라이드 (커스텀 필터링) -> 특정 조건 충족 시만 보이기
특정 조건을 만족하는 경우만 액터를 클라이언트에게 보낼 수 있음.
예제: 같은 팀 플레이어만 특정 액터(팀원 위치)를 볼 수 있도록 설정

Always Relevant 설정 (중요한 액터 예외 처리) -> 중요한 액터 항상 보이기
항상 모든 클라이언트에게 전송해야 하는 액터는 bAlwaysRelevant = true로 설정 가능
예제: 게임 오브젝트, 중요한 미션 목표, 보스 몬스터 등

2. Dormancy (비활성화)

Dormancy(도먼시, 휴면 상태)는 네트워크 트래픽을 줄이기 위해 특정 액터(Actor)의 상태 업데이트를 중단하는 기능입니다.
즉, 액터가 자주 변하지 않는다면 네트워크 동기화를 멈추고, 필요할 때만 다시 활성화하는 방식입니다.

사용하는 이유

멀티플레이어 게임에서 서버는 클라이언트들에게 계속 네트워크 업데이트를 보내야 합니다.
하지만 모든 액터의 상태를 지속적으로 동기화하면 서버 부담이 커지고 네트워크 트래픽이 증가하죠.

Dormancy를 사용하면?
✔ 자주 변하지 않는 액터의 네트워크 업데이트를 멈출 수 있음
✔ 필요할 때만 다시 동기화하여 네트워크 트래픽 절약
✔ 멀티플레이 서버 최적화에 필수적인 기능

작동방식

DORM_Never -> 변경이 자주 발생하는 액터 (플레이어, 움직이는 오브젝트 등) : 계속 동기화 필요
DORM_DormantAll -> 일정 상태가 유지되는 오브젝트 (문, 상자, 퀘스트 오브젝트) : 변하지 않으면 업데이트 중단
DORM_DormantAll + FlushNetDormancy() -> 가끔 상태가 바뀌는 오브젝트 (인터랙션 오브젝트, 보스 등장 등) : 기본적으로 비활성화, 필요할 때만 깨우기
DORM_Initial -> 처음 한 번만 동기화되면 되는 오브젝트 (장식, 배경 오브젝트 등) : 최초 1회만 전송하고 이후 업데이트 없음

다시 깨우기(FlushNetDormancy)

Dormancy 상태의 액터는 기본적으로 동기화되지 않지만, 변경이 필요할 때만 다시 업데이트할 수 있음

void AMyActor::Activate()
{
    // 액터를 깨어나게 하고 다시 동기화 시작
    FlushNetDormancy();
    
    // 이 상태에서 값이 변경되면 클라이언트에게 전송됨
    bIsActive = true;
    OnRep_IsActive();
}

FlushNetDormancy()를 호출하면 Dormant 상태가 깨지고 서버가 다시 동기화를 시작함!

Dormancy와 Relevancy의 조합

대부분 멀티플레이어 게임에선 Dormancy와 Relevancy에 대한 설정을 함께 사용한다고 합니다.

예를 들어서
멀리 떨어진 적NPC는 Relevant 하지 않다고 처리되서 리플리케이션을 한하다가 플레이어가 가까이 가게되면 Relevant 하다고 인식이 되면 그때
리플리케이션을 시작해 움직이게끔 하게 한다 하지만 가만히 서있는 NPC라면 여전히 별 변화가 없으니깐 Dormancy 한 상태로 두고
전투 등으로 활동 할 때 깨게 하고 다시 전투가 끝나면 Dormancy 한 상태로 돌아가게 하는 조합으로 사용 된다고 생각하면 쉽습니다.
그리고 이렇게 하게 되면 네트워크가 한가하다가 정말 필요한 순간에만 사용되게 해서 효율 높게 사용할수 있습니다.

NetUpdateFrequency (초당 최대 업데이트 횟수)

  • 이 액터(Actor)의 네트워크 업데이트 빈도를 설정하는 값
  • 기본적으로 초당 몇 번 업데이트할지를 결정함
  • 값이 높을수록 더 자주 동기화되지만, Bandwidth를 더 많이 사용

NetPriority (중요도)

  • 여러 액터가 동시에 업데이트 요청할 때, 어떤 액터를 우선적으로 처리할지 결정
  • 숫자가 클수록 우선순위가 높아 네트워크가 혼잡할 때 먼저 전송됨
  • 일반적으로 플레이어 캐릭터(Pawn)는 높은 우선순위를 갖도록 설정

Adaptive Frequency (적응형 업데이트 빈도)

Adaptive Frequency는 네트워크 업데이트 빈도를 상황에 따라 동적으로 조절하는 기술입니다.
즉, 중요한 순간에는 업데이트를 자주 하고, 그렇지 않을 때는 줄여서 네트워크 부하를 최적화하는 방식입니다.

멀티플레이 게임에서는 모든 액터의 상태를 일정한 주기로 동기화하면 Bandwidth(네트워크 대역폭) 낭비가 발생합니다.
하지만 Adaptive Frequency를 사용하면?

  • 중요한 순간에는 부드러운 플레이를 유지
  • 불필요한 데이터 전송을 줄여 네트워크 최적화

네트워크 최적화 방법 (Throttling 고려 사항)

  1. 업데이트 간격 늘리기 (NetUpdateFrequency 낮추기)
  • 중요도가 낮은 액터의 업데이트 빈도를 줄이면 Bandwidth 절약 가능
  • 예: 멀리 있는 적 NPC는 1초에 한 번만 업데이트
  1. 조건부로 보내기 (변화 있을 때만 전송)
  • 값이 바뀔 때만 업데이트하면 불필요한 데이터 전송 방지 가능
  • 예: 체력 변화가 있을 때만 RPC로 전송
  1. 중요한 순간에 즉시 업데이트
  • 평소에는 천천히 업데이트하다가, 전투 시작하면 즉시 전송
  • 예: 플레이어가 가까워지면 ForceNetUpdate()로 즉시 업데이트

상황별 NetUpdateFrequency & NetPriority 설정 가이드

profile
기록은 기억을 지배한다!

0개의 댓글