[DAY70] Network Optimization : Relevancy & Priority

베리투스·2025년 11월 25일

TIL: Today I Learned

목록 보기
60/93
post-thumbnail

네트워크 대역폭은 무한하지 않다. 서버는 모든 클라이언트에게 모든 데이터를 보낼 수 없다. 그래서 "누구에게 보낼 것인가?(Relevancy)""누구에게 먼저 보낼 것인가?(Priority)"를 결정하는 규칙이 필요하다. 오늘은 서버의 데이터 전송 최적화 전략인 RelevancyNetPriority를 정리했다.


📌 오늘의 목표

  • NetRelevancy(연관성)의 개념과 판단 기준(IsNetRelevantFor) 이해하기
  • NetPriority(우선순위)가 계산되는 방식과 전송 순서 파악하기
  • 포화 상태(Saturation) 발생 시 언리얼 엔진의 대처 방식 이해하기

📚이론 및 원리

1. "너랑 상관 있는 데이터야?" : Relevancy (연관성)

서버는 맵에 있는 수많은 액터 중, 특정 클라이언트에게 '의미 있는(Relevant)' 액터의 데이터만 골라서 보낸다. 부산에 있는 플레이어에게 서울에서 떨어진 아이템 정보를 보낼 필요는 없기 때문이다.

  • 주요 판단 기준 (IsNetRelevantFor):
    1. Owner: 내가 소유한 액터인가? (내 총, 내 캐릭터)
    2. AlwaysRelevant: 항상 중요한가? (GameState, 중요 퀘스트 NPC)
    3. NetCullDistance: 거리가 가까운가? (가장 일반적인 기준)
    4. Instigator: 나에게 데미지를 준 놈인가? (나를 때린 총알)
bool AActor::IsNetRelevantFor(const AActor* RealViewer, ...) const
{
    // 1. 항상 연관됨 (중요 액터)
    if (bAlwaysRelevant) return true;
    
    // 2. 내가 주인임
    if (IsOwnedBy(RealViewer)) return true;
    
    // 3. 거리 기반 (Cull Distance)
    return IsWithinNetRelevancyDistance(SrcLocation);
}

2. "누구 먼저 보낼까?" : NetPriority (우선순위)

보낼 대상을 골랐어도(Relevancy), 한 번에 다 못 보낼 수 있다. 대역폭이 꽉 차면 더 급한 놈부터 보내야 한다. 이를 결정하는 것이 NetPriority다.

  • 기본값: PlayerController(3.0) > Pawn(2.0) > Actor(1.0)
    • 즉, 조작감과 직결되는 내 캐릭터 정보가 배경 사물보다 3배 더 자주 전송될 확률이 높다.
  • 가중치 계산:
    • GetNetPriority() 함수에서 계산된다.
    • 마지막 전송 후 시간이 오래 지날수록 가중치가 높아져서 언젠가는 전송 기회를 얻게 된다. (기아 현상 방지)
    • 시야(ViewDir) 정면에 있는 액터는 우선순위가 더 높게 책정된다.

3. 대역폭이 터졌다! : 포화 상태 (Saturation)

만약 보내야 할 데이터가 허용된 대역폭(Bandwidth)을 초과하면 어떻게 될까?
서버는 NetPriority가 높은 순서대로 데이터를 채워 넣고, 자리가 모자라면 나머지 액터는 다음 프레임으로 전송을 미룬다.

  • 해결책:
    • 중요한 액터의 NetPriority를 높인다.
    • NetUpdateFrequency를 낮춰서 전송 빈도를 줄인다.
    • Replication 데이터를 최적화하여 패킷 크기 자체를 줄인다.

✅ 핵심 요약

개념질문결정 기준
Relevancy"이 데이터를 보낼까 말까?"거리(Cull Distance), 소유권(Owner), 중요도(AlwaysRelevant)
Priority"누구를 먼저 보낼까?"액터 타입, 마지막 전송 후 경과 시간, 시야각
Saturation"다 못 보내면 어떡하지?"우선순위 낮은 놈은 다음 틱으로 미룸
profile
Shin Ji Yong // Unreal Engine 5 공부중입니다~

0개의 댓글