Bandwidth(대역폭)는 네트워크가 1초 동안 전송할 수 있는 최대 데이터 양을 의미합니다.
즉, 얼마나 많은 정보를 동시에 보낼 수 있는가를 나타내는 개념입니다.
단위: bps (bits per second, 초당 비트 수)
예제:
100 Mbps (100 Megabits per second) → 초당 100Mb(메가비트) 데이터를 전송 가능
1 Gbps (1 Gigabit per second) → 초당 1Gb(기가비트) 전송 가능
멀티플레이 게임에서는 서버와 클라이언트 간의 네트워크 트래픽을 최적화해야 함
✔ Bandwidth가 낮으면? → 데이터가 밀려서 지연(Latency) 발생
✔ Bandwidth가 너무 높으면? → 불필요한 데이터 전송으로 서버 부하 증가
즉, Bandwidth를 효율적으로 관리해야 네트워크 성능이 최적화됨!
데이터를 전송할 때 압축하면 네트워크 부하를 줄일 수 있음
예제: JSON 대신 Binary Format 사용, zlib 압축 등
Unreliable RPC 사용: 중요하지 않은 데이터는 손실을 허용하여 Bandwidth 절약
Net Cull Distance 설정: 일정 거리 이상 떨어진 액터는 업데이트 중단
Dormancy 사용: 변하지 않는 액터의 네트워크 동기화 중지
큰 데이터를 한 번에 보내기보다, 작은 패킷으로 쪼개서 전송
예: 움직임 데이터는 30FPS마다 보내는 대신, 중요한 순간만 전송
여기서 그럼 언리얼에서 네트워크를 효율적으로 관리할 수 있는 몇가지 기능들에대해서 소개해 드리겠습니다.
Actor Relevancy는 서버가 어떤 액터(Actor)의 정보를 특정 클라이언트에게 전송할지 결정하는 메커니즘입니다.
즉, "이 플레이어에게 이 액터를 보여줄 필요가 있는가?"를 판단하는 기준이 됩니다.
서버는 각 클라이언트에 대해 어떤 액터가 "Relevant(연관됨)"한지 판단하여, 연관된 액터의 정보만 네트워크로 전송합니다.

Net Cull Distance Squared 설정 (기본 거리 기반 필터링) -> 멀리 있는 액터 숨기기
액터가 일정 거리 이상 떨어지면 자동으로 네트워크 업데이트를 중지함.
멀리 있는 액터는 비활성화하여 네트워크 부하를 줄일 수 있음
팀 또는 시야(Visibility) 여부
예: 적군의 위치는 미니맵에서 보이지 않지만, 같은 팀원은 보이도록 설정 가능.
특정 조건을 만족하는 경우
예: 미션을 수행해야 나타나는 액터, 특정 이벤트 발생 시만 보이는 액터 등.
AActor::IsNetRelevantFor 오버라이드 (커스텀 필터링) -> 특정 조건 충족 시만 보이기
특정 조건을 만족하는 경우만 액터를 클라이언트에게 보낼 수 있음.
예제: 같은 팀 플레이어만 특정 액터(팀원 위치)를 볼 수 있도록 설정
Always Relevant 설정 (중요한 액터 예외 처리) -> 중요한 액터 항상 보이기
항상 모든 클라이언트에게 전송해야 하는 액터는 bAlwaysRelevant = true로 설정 가능
예제: 게임 오브젝트, 중요한 미션 목표, 보스 몬스터 등
Dormancy(도먼시, 휴면 상태)는 네트워크 트래픽을 줄이기 위해 특정 액터(Actor)의 상태 업데이트를 중단하는 기능입니다.
즉, 액터가 자주 변하지 않는다면 네트워크 동기화를 멈추고, 필요할 때만 다시 활성화하는 방식입니다.
멀티플레이어 게임에서 서버는 클라이언트들에게 계속 네트워크 업데이트를 보내야 합니다.
하지만 모든 액터의 상태를 지속적으로 동기화하면 서버 부담이 커지고 네트워크 트래픽이 증가하죠.
Dormancy를 사용하면?
✔ 자주 변하지 않는 액터의 네트워크 업데이트를 멈출 수 있음
✔ 필요할 때만 다시 동기화하여 네트워크 트래픽 절약
✔ 멀티플레이 서버 최적화에 필수적인 기능


DORM_Never -> 변경이 자주 발생하는 액터 (플레이어, 움직이는 오브젝트 등) : 계속 동기화 필요
DORM_DormantAll -> 일정 상태가 유지되는 오브젝트 (문, 상자, 퀘스트 오브젝트) : 변하지 않으면 업데이트 중단
DORM_DormantAll + FlushNetDormancy() -> 가끔 상태가 바뀌는 오브젝트 (인터랙션 오브젝트, 보스 등장 등) : 기본적으로 비활성화, 필요할 때만 깨우기
DORM_Initial -> 처음 한 번만 동기화되면 되는 오브젝트 (장식, 배경 오브젝트 등) : 최초 1회만 전송하고 이후 업데이트 없음
Dormancy 상태의 액터는 기본적으로 동기화되지 않지만, 변경이 필요할 때만 다시 업데이트할 수 있음
void AMyActor::Activate()
{
// 액터를 깨어나게 하고 다시 동기화 시작
FlushNetDormancy();
// 이 상태에서 값이 변경되면 클라이언트에게 전송됨
bIsActive = true;
OnRep_IsActive();
}
FlushNetDormancy()를 호출하면 Dormant 상태가 깨지고 서버가 다시 동기화를 시작함!
대부분 멀티플레이어 게임에선 Dormancy와 Relevancy에 대한 설정을 함께 사용한다고 합니다.
예를 들어서
멀리 떨어진 적NPC는 Relevant 하지 않다고 처리되서 리플리케이션을 한하다가 플레이어가 가까이 가게되면 Relevant 하다고 인식이 되면 그때
리플리케이션을 시작해 움직이게끔 하게 한다 하지만 가만히 서있는 NPC라면 여전히 별 변화가 없으니깐 Dormancy 한 상태로 두고
전투 등으로 활동 할 때 깨게 하고 다시 전투가 끝나면 Dormancy 한 상태로 돌아가게 하는 조합으로 사용 된다고 생각하면 쉽습니다.
그리고 이렇게 하게 되면 네트워크가 한가하다가 정말 필요한 순간에만 사용되게 해서 효율 높게 사용할수 있습니다.

Adaptive Frequency는 네트워크 업데이트 빈도를 상황에 따라 동적으로 조절하는 기술입니다.
즉, 중요한 순간에는 업데이트를 자주 하고, 그렇지 않을 때는 줄여서 네트워크 부하를 최적화하는 방식입니다.
멀티플레이 게임에서는 모든 액터의 상태를 일정한 주기로 동기화하면 Bandwidth(네트워크 대역폭) 낭비가 발생합니다.
하지만 Adaptive Frequency를 사용하면?
