[Unreal Engine] Actor Relevancy and Priority

Imeamangryang·2025년 8월 8일

Unreal Network & Multiplay

목록 보기
11/12
post-thumbnail

출처 ㅣ Cedric Neukirchen - Multiplayer Network Compendium


Relevancy(연관성)

'연관성(Relevancy)'이란 무엇이며, 왜 필요할까요?

맵이나 레벨이 충분히 커서 플레이어가 서로에게 '중요하지 않은' 존재가 될 수 있는 게임을 상상해보세요.

플레이어 'A'가 플레이어 'B'와 수 마일 떨어져 있다면, 굳이 'B'의 네트워크 업데이트를 받아야 할 필요가 있을까요?

대역폭을 절약하기 위해 언리얼 엔진의 네트워크 코드는 서버가 각 클라이언트에게 해당 클라이언트의 관련 집합에 속한 액터만 알려주도록 설계되어 있습니다.

언리얼 엔진은 플레이어에게 관련된 액터 집합을 결정하기 위해 다음과 같은 규칙을(순서대로) 적용합니다. 이러한 테스트는 가상 함수 'AActor::IsNetRelevantFor()'에 구현되어 있습니다.

  1. 액터가 'bAlwaysRelevant'로 표시되어 있거나, Pawn 또는 PlayerController에 의해 소유되고 있거나, 해당 Pawn이거나, Pawn이 소음이나 데미지와 같은 행동의 Instigator인 경우, 연관성이 있습니다.
  2. 액터가 'bNetUserOwnerRelevancy'로 표시되어 있고 Owner가 있다면, Owner의 연관성을 사용합니다.
  3. 액터가 'bOnlyRelevantToOwner'로 표시되어 있고 첫 번째 조건을 통과하지 못하면, 연관성이 없습니다.
  4. 액터가 다른 액터의 Skeleton에 부착되어 있다면, 그 베이스의 연관성에 따라 결정됩니다.
  5. 액터가 숨김 처리되어 있고('bHidden == true'), 루트 컴포넌트가 충돌하지 않는다면, 연관성이 없습니다.
    • 루트 컴포넌트가 없다면, 'AActor::IsNetRelevantFor()'는 경고를 로그로 남기고 액터를 'bAlwaysRelevant = true'로 설정해야 하는지 묻습니다.
  6. 'AGameNetworkManager'가 거리 기반 연관성을 사용하도록 설정되어 있다면, 액터가 네트워크 컬 거리보다 가까우면 연관성이 있습니다.

💡info
Pawn과 PlayerController는 'AActor::IsNetRelevantFor()'를 오버라이드하며, 그 결과 연관성에 대한 조건이 다릅니다.


Prioritization

언리얼 엔진은 모든 액터에 우선순위를 부여하고, 게임플레이에서의 중요도에 따라 각 액터가 공평하게 대역폭을 할당받도록 하는 로드 밸런싱 기법을 사용합니다.

액터에는 “NetPriority”라는 float 변수가 있습니다. 이 값이 높을수록 해당 액터는 다른 액터에 비해 더 많은 대역폭을 할당받습니다.
예를 들어, “NetPriority”가 2.0인 액터는 1.0인 액터보다 정확히 두 배 더 자주 업데이트됩니다.

우선순위에서 중요한 것은 값 자체가 아니라 비율입니다. 따라서 모든 액터의 우선순위를 올린다고 해서 네트워크 성능이 향상되지는 않습니다.

액터의 현재 우선순위는 가상 함수 'AActor::GetNetPriority()'를 통해 계산됩니다.
기아 현상을 방지하기 위해 'AActor::GetNetPriority()'는 'NetPriority'에 액터가 마지막으로 복제된 이후 경과 시간을 곱합니다.

또한 'GetNetPriority' 함수는 액터와 뷰어(Viewer) 간의 상대 위치와 거리를 함께 고려합니다.

이러한 설정 대부분은 블루프린트의 클래스 기본값(Class Defaults)에서 찾을 수 있으며, 각 액터 자식의 C++ 클래스 내에서도 설정할 수 있습니다.

bOnlyRelevantToOwner = false;
bAlwaysRelevant = false;
bReplicateMovement = true;
bNetLoadOnClient = true;
bNetUseOwnerRelevancy = false;
bReplicates = true;
NetUpdateFrequency = 100.f;
NetCullDistanceSquared = 225000000.f;
NetPriority = 1.f;
profile
언리얼 엔진 주니어(신입) 개발자 | 소설 쓰는 취준 개발자

0개의 댓글