
네트워크 대역폭은 무한하지 않다. 서버는 모든 클라이언트에게 모든 데이터를 보낼 수 없다. 그래서 "누구에게 보낼 것인가?(Relevancy)"와 "누구에게 먼저 보낼 것인가?(Priority)"를 결정하는 규칙이 필요하다. 오늘은 서버의 데이터 전송 최적화 전략인 Relevancy와 NetPriority를 정리했다.
IsNetRelevantFor) 이해하기서버는 맵에 있는 수많은 액터 중, 특정 클라이언트에게 '의미 있는(Relevant)' 액터의 데이터만 골라서 보낸다. 부산에 있는 플레이어에게 서울에서 떨어진 아이템 정보를 보낼 필요는 없기 때문이다.
bool AActor::IsNetRelevantFor(const AActor* RealViewer, ...) const
{
// 1. 항상 연관됨 (중요 액터)
if (bAlwaysRelevant) return true;
// 2. 내가 주인임
if (IsOwnedBy(RealViewer)) return true;
// 3. 거리 기반 (Cull Distance)
return IsWithinNetRelevancyDistance(SrcLocation);
}
보낼 대상을 골랐어도(Relevancy), 한 번에 다 못 보낼 수 있다. 대역폭이 꽉 차면 더 급한 놈부터 보내야 한다. 이를 결정하는 것이 NetPriority다.
PlayerController(3.0) > Pawn(2.0) > Actor(1.0)GetNetPriority() 함수에서 계산된다.만약 보내야 할 데이터가 허용된 대역폭(Bandwidth)을 초과하면 어떻게 될까?
서버는 NetPriority가 높은 순서대로 데이터를 채워 넣고, 자리가 모자라면 나머지 액터는 다음 프레임으로 전송을 미룬다.
NetPriority를 높인다.NetUpdateFrequency를 낮춰서 전송 빈도를 줄인다.Replication 데이터를 최적화하여 패킷 크기 자체를 줄인다.| 개념 | 질문 | 결정 기준 |
|---|---|---|
| Relevancy | "이 데이터를 보낼까 말까?" | 거리(Cull Distance), 소유권(Owner), 중요도(AlwaysRelevant) |
| Priority | "누구를 먼저 보낼까?" | 액터 타입, 마지막 전송 후 경과 시간, 시야각 |
| Saturation | "다 못 보내면 어떡하지?" | 우선순위 낮은 놈은 다음 틱으로 미룸 |