언리얼 엔진은 네트워크 업데이트 동안 모든 액터의 리플리케이트를 보증하지는 않습니다. 이는 네트워킹 리소스가 제한적이기 때문입니다. 주요 제한 인수는 연결 대역폭입니다. 연결 대역폭 은 해당 연결의 최대 데이터 전송 용량입니다. 연결이 용량을 초과하면 포화 상태 가 됩니다. 연결이 포화 상태가 되면, 언리얼 엔진의 리플리케이션 시스템은 로드 밸런싱 기법을 사용하여 모든 액터에 수치화된 우선순위 를 할당합니다. 이러한 우선순위를 통해 게임플레이에서 각 액터의 중요도에 따라 사용 가능한 네트워크 대역폭 리소스를 공정하게 배분합니다. 상대적으로 우선순위가 높은 액터는 리플리케이트에 더 중요한 액터이므로 리플리케이션을 위해 더 많은 대역폭이 할당됩니다.
액터 우선순위 얻기
액터마다 부동 소수점 AActor::NetPriority 프로퍼티가 있습니다. NetPriority 가 클수록 다른 액터에 비해 현재 액터에 더 많은 대역폭이 할당됩니다. 예를 들어 NetPriority == 2.0 인 액터에는 NetPriority == 1.0 인 액터보다 더 많은 리소스가 주어집니다. 우선순위에서 중요한 것은 비율밖에 없습니다. 모든 액터의 넷 우선순위를 조정하여 언리얼 엔진의 네트워크 퍼포먼스를 향상할 수는 없습니다.
다음은 일반적인 언리얼 엔진 클래스에서 사용하는 기준 초기 값입니다.
| 클래스 | 우선순위 |
|---|---|
AActor |
1.0 |
APawn |
3.0 |
APlayerController |
3.0 |
NetPriority 는 대역폭이 낮거나 포화된 연결에 사용되는 기준입니다. AActor::GetNetPriority 는 베이스 NetPriority , 뷰어와의 거리, 마지막 리플리케이트 이후 시간 등 다양한 요소에 따라 액터의 현재 우선순위를 결정합니다.
액터의 현재 우선순위 얻기
네트워크 드라이버는 GetNetPriority 를 호출하여 특정 연결에 대한 액터의 현재 리플리케이션 우선순위를 결정합니다. 이는 네트워크 드라이버가 자동으로 처리합니다.
액터 연관성 오버라이드
AActor 파생 클래스에 GetNetPriority 가상 함수를 오버라이드하여 액터 우선순위를 커스터마이징하고 NetPriority 로 베이스 네트워크 우선순위를 변경할 수 있습니다.
액터의 GetNetPriority 는 주의해서 오버라이드해야 합니다. 언리얼 엔진의 리플리케이션 시스템에 익숙하지 않다면 이러한 오버라이드로 인해 예상치 못한 결과가 발생할 수도 있습니다.
우선순위 결정 방법
액터의 현재 네트워크 우선순위는 해당 액터가 마지막으로 리플리케이트된 이후의 시간을 비롯한 다양한 추가 요소에 따라 계산되어 부동 소수점 우선순위를 얻습니다.
파라미터
액터 네트워크 우선순위는 다음과 같은 입력 파라미터에 따라 달라집니다.
| 파라미터 | 설명 |
|---|---|
ViewPos |
뷰어의 위치입니다. |
ViewDir |
뷰어가 바라보는 방향입니다. |
Viewer |
네트워크 우선순위가 결정되는 클라이언트가 소유한 네트워크 오브젝트입니다. 이는 일반적으로 플레이어 컨트롤러입니다. |
ViewTarget |
현재 Viewer 가 보거나 제어하는 액터입니다. 이는 일반적으로 폰입니다. |
InChannel |
이 액터가 리플리케이트되고 있는 채널입니다. |
Time |
액터가 마지막으로 리플리케이트된 이후 시간입니다. |
bLowBandwidth |
뷰어의 대역폭이 낮으면 true입니다. |
우선순위 로직
대부분의 AActor::GetNetPriority 작업은 뷰어의 거리와 시야, 현재 액터가 마지막으로 리플리케이트된 이후 시간을 기반으로 상수 AActor::NetPriority 의 곱하기 인수를 계산하는 데 사용됩니다.
네트워크 우선순위는 다음과 같은 요인으로 결정됩니다.
- 다음 조건을 모두 충족하면 현재 액터는 그 오너의 네트워크 우선순위를 사용합니다.
- 현재 액터에 오너가 있습니다.
- 현재 액터가 오너의 네트워크 연관성을 사용하도록 설정되어 있습니다.
- 다음 조건 중 하나 이상의 조건을 충족하면 현재 액터의 네트워크 우선순위가 증가합니다.
- 현재 액터가 현재 연결의 폰입니다.
- 현재 연결의 폰이 특정 액션의 인스티게이터입니다.
- 위의 두 경우에 해당하지 않으면 거리 기반 계산을 수행하여 현재 액터의 네트워크 우선순위를 결정합니다.
- 현재 액터가 뷰어 정면에 있으면 설정된 거리에 반비례하여 우선순위가 감소합니다.
- 현재 액터와 뷰어 간의 거리가
CLOSEPROXIMITY보다 멀지만NEARSIGHTTHRESHOLD보다 가까우면 우선순위에0.2를 곱합니다. - 현재 액터와 뷰어 간의 거리가
NEARSIGHTTHRESHOLD보다 멀면 우선순위에0.4를 곱합니다.
- 현재 액터와 뷰어 간의 거리가
- 현재 액터와 뷰어 간의 거리가
FARSIGHTTHRESHOLD보다 가깝고 뷰어가 현재 액터를 바라보고 있으면 우선순위에2.0을 곱합니다. - 현재 액터와 뷰어 간의 거리가
MEDSIGHTTHRESHOLD보다 멀면 우선순위에0.4를 곱합니다.
- 현재 액터가 뷰어 정면에 있으면 설정된 거리에 반비례하여 우선순위가 감소합니다.
거리 및 시야 한계치 상수의 값은 다음과 같습니다.
| 상수 | 값 |
|---|---|
CLOSEPROXIMITY |
500 |
NEARSIGHTTHRESHOLD |
2000 |
MEDSIGHTTHRESHOLD |
3162 |
FARSIGHTTHRESHOLD |
8000 |
이러한 상수 정의는 NetworkingDistanceConstants.h 에서 확인할 수 있습니다.
우선순위 레퍼런스
함수
| 이름 | 설명 |
|---|---|
GetNetPriority |
리플리케이트할 액터를 결정할 때 액터 우선순위 지정에 사용됩니다. |
GetReplayPriority |
GetNetPriority 와 비슷합니다. 리플레이 녹화 중 액터 우선순위 결정에 사용됩니다. |
프로퍼티
| 이름 | 설명 |
|---|---|
bNetUseOwnerRelevancy |
액터에 유효한 오너가 있으면 그 오너의 IsNetRelevantFor 및 GetNetPriority 를 호출합니다. |
NetPriority |
대역폭이 낮거나 포화 상태일 때 리플리케이션을 확인할 경우 이 액터의 우선순위입니다. 우선순위가 높을수록 리플리케이트될 가능성이 커집니다. |