아이리스 우선순위 지정 시스템(Iris Prioritization System) 은 리플리케이트할 액터의 우선순위를 지정합니다. 대역폭이 제한되므로 프레임마다 리플리케이트된 오브젝트나 프로퍼티가 모두 업데이트되지는 않습니다. 프레임마다 리플리케이트할 가장 중요한 오브젝트를 결정하기 위해 우선순위 지정 시스템이 부동 소수점 리플리케이션 우선순위 를 할당하여 오브젝트와 액터의 순위를 지정합니다. 다른 오브젝트보다 우선순위가 높을수록 해당 오브젝트가 리플리케이트될 확률이 높습니다. 우선순위 범위에 따라 오브젝트가 리플리케이션 대상으로 고려되는지 여부에 미치는 영향이 다릅니다.
- 0.0~1.0 미만: 오브젝트가 이 프레임에서 리플리케이션 대상으로 고려되지 않습니다.
- 1.0 이상: 업데이트되고 리플리케이트된 프로퍼티가 있는 경우, 오브젝트가 이 프레임에서 리플리케이션 대상으로 고려됩니다.
오브젝트가 리플리케이트되고 해당 우선순위가 리셋될 때까지 네트워크 틱 전반에 걸쳐 리플리케이션 우선순위가 누적됩니다. 즉, 우선순위가 낮은 오브젝트라도 결국에는 리플리케이션 대상으로 고려될 만큼 높은 우선순위에 이르게 됩니다. 우선순위 지정은 코드 및 데이터 캐시 누락을 최소화하기 위해 오브젝트 배치를 통해 이루어집니다.
아이리스는 두 가지 타입의 우선순위 지정을 제공합니다.
스태틱 우선순위 지정자
스태틱 우선순위 지정자는 오브젝트나 액터에 상수 우선순위 숫자를 할당합니다. 오브젝트에 스태틱 우선순위를 할당하는 단계는 다음과 같습니다.
-
리플리케이트된 오브젝트에 대한
FNetRefHandle을 얻습니다. 아이리스는 이 식별자를 사용하여 리플리케이션 시스템 내에서 오브젝트를 찾습니다.#if UE_WITH_IRIS #include "Net/Iris/ReplicationSystem/ReplicationSystemUtil.h" #endif UE_WITH_IRIS // 유효한 리플리케이트된 오브젝트 포인터 사용 FNetRefHandle ObjectHandle = UE::Net::FReplicationSystemUtil::GetNetHandle(RepActorPtr); -
오브젝트 리플리케이트를 담당하는 리플리케이션 시스템에 대한 레퍼런스를 얻습니다.
UReplicationSystem* ReplicationSystem = UE::Net::FReplicationSystemUtil::GetReplicationSystem(RepActorPtr); -
스태틱 우선순위를 사용하도록 오브젝트를 설정합니다.
ReplicationSystem->SetStaticPriority(ObjectHandle, 1.0f);
다이내믹 우선순위 지정자
다이내믹 우선순위 지정자는 선택한 우선순위 지정자에 의해 정의된 로직에 따라 오브젝트나 액터에 변수 우선순위 숫자를 할당합니다. 언리얼 엔진(UE)은 다음과 같은 몇 가지 유용한 다이내믹 우선순위 지정자를 제공합니다.
SphereNetObjectPrioritizerSphereWithOwnerBoostNetObjectPrioritizerNetObjectCountLimiter
기본 제공되는 다이내믹 우선순위 지정자를 사용해도 되고 자체 우선순위 지정자를 생성해도 됩니다. 자체 다이내믹 우선순위 지정자 생성 방법에 대한 자세한 내용은 커스텀 다이내믹 우선순위 지정자 생성하기를 참조하세요.
다이내믹 우선순위 지정자 지정하기
다이내믹 우선순위 지정자를 리플리케이트된 오브젝트에 할당하는 단계는 다음과 같습니다.
-
리플리케이트된 오브젝트에 대한
FNetRefHandle을 얻습니다.#if UE_WITH_IRIS #include "Net/Iris/ReplicationSystem/ReplicationSystemUtil.h" #endif UE_WITH_IRIS // 유효한 리플리케이트된 오브젝트 포인터 사용 FNetRefHandle ObjectHandle = UE::Net::FReplicationSystemUtil::GetNetHandle(RepActorPtr); -
오브젝트 리플리케이트를 담당하는 리플리케이션 시스템에 대한 레퍼런스를 얻습니다.
UReplicationSystem* ReplicationSystem = UE::Net::FReplicationSystemUtil::GetReplicationSystem(RepActorPtr); -
사용하려는 다이내믹 우선순위 지정자에 대한 핸들을 얻습니다.
// 커스텀 우선순위 지정자를 사용하려면 SphereNetObjectPrioritizer를 커스텀 우선순위 지정자 이름으로 대체합니다. FNetObjectPrioritizerHandle PrioritizerHandle = ReplicationSystem->GetPrioritizerHandle(FName("SphereNetObjectPrioritizer"));커스텀 다이내믹 우선순위 지정자를 사용하려는 경우,
DefaultEngine.ini파일에 해당 우선순위 지정자를 환경설정해야 합니다. 자세한 내용은 커스텀 다이내믹 우선순위 지정자 환경설정하기 섹션을 참조하세요. -
오브젝트에 다이내믹 우선순위 지정자를 할당합니다.
if (!ReplicationSystem->SetPrioritizer(ObjectHandle, PrioritizerHandle)) { UE_LOG(LogTemp, Warning, TEXT("Failed to assign dynamic prioritizer.")); // 다이내믹 우선순위 지정자 할당에 실패하여 예비 스태틱 우선순위를 할당합니다. ReplicationSystem->SetStaticPriority(ObjectHandle, 1.0f); }
제공되는 다이내믹 우선순위 지정자 레퍼런스
스피어 우선순위 지정자
리플리케이트된 월드 위치가 있는 모든 액터에 기본적으로 이 다이내믹 우선순위 지정자가 사용됩니다. 이 우선순위 지정자를 반경이 한정된 두 개의 동심원으로 시각화할 수 있습니다.
- 내부 스피어 안에 있는 오브젝트의 우선순위가 가장 높습니다.
- 내부 스피어 밖에 있지만 외부 스피어 안에 있는 오브젝트의 우선순위는 위치에 따라 동적으로 달라집니다.
- 외부 스피어 밖에 있는 오브젝트는 우선순위가 가장 낮습니다.
뷰어를 기준으로 공간에 있는 오브젝트에 대한 스피어 우선순위 지정자를 시각화한 것입니다.
다음은 스피어 우선순위 지정자의 작동 방식에 대한 자세한 설명입니다. 뷰어(플레이어)는 중앙에 표시됩니다. 뷰어를 기준으로 오브젝트 위치에 따라 우선순위가 지정됩니다. 내부 스피어에 있는 오브젝트에는 내부 우선순위가 지정됩니다. 외부 스피어 외부에 있는 오브젝트에는 외부 우선순위가 지정됩니다. 내부 스피어와 외부 스피어 사이에 있는 오브젝트에는 오브젝트와 뷰어 사이의 제곱 거리에 따라 가변 우선순위가 지정됩니다.
우선순위 시각화에 사용되는 컬러는 다음과 같은 의미를 지닙니다.
- 녹색: 내부 우선순위
- 노란색: 내부와 외부 사이 우선순위
- 빨간색: 외부 우선순위
다음 그레이디언트 표면 플롯은 원점에 있는 뷰어를 기준으로 오브젝트의 위치에 따른 우선순위를 보여줍니다.
동일한 XY 평면에서 뷰어를 기준으로 오브젝트 위치에 따른 오브젝트 우선순위입니다. 빨간색은 외부 우선순위에 해당하며, 노란색은 내부와 외부 사이 우선순위, 녹색은 내부 우선순위에 해당합니다.
스피어 우선순위 지정자 환경설정하기
DefaultEngine.ini 같은 엔진 환경설정 파일에서 SphereNetObjectPrioritizer 를 환경설정할 수 있습니다.
[Script/Iris.SphereNetObjectPrioritizerConfig]
InnerRadius=<INNER_RADIUS>
OuterRadius=<OUTER_RADIUS>
InnerPriority=<INNER_PRIORITY>
OuterPriority=<OUTER_PRIORITY>
OutsidePriority=<OUTSIDE_PRIORITY>
예를 들어, 디폴트 환경설정 세팅은 다음과 같습니다.
[Script/Iris.SphereNetObjectPrioritizerConfig]
InnerRadius=1000.0
OuterRadius=5000.0
InnerPriority=1.0
OuterPriority=0.2
OutsidePriority=0.1
오너 부스트 스피어 우선순위 지정자
SphereWithOwnerBoostNetObjectPrioritizer 는 스피어 우선순위 지정자와 같지만, 소유한 연결에 대한 우선순위를 제공합니다. 이러한 경우, 우선순위 지정자는 일반적으로 스피어 우선순위 지정자에 의해 계산되는 우선순위에 OwnerPriorityBoost 값을 더합니다.
오너 부스트 스피어 우선순위 지정자 환경설정하기
DefaultEngine.ini 같은 엔진 환경설정 파일에서 SphereWithOwnerBoostNetObjectPrioritizer 를 환경설정할 수 있습니다.
[Script/Iris.SphereWithOwnerBoostNetObjectPrioritizerConfig]
InnerRadius=<INNER_RADIUS>
OuterRadius=<OUTER_RADIUS>
OwnerPriorityBoost=<OWNER_BOOST_PRIORITY>
InnerPriority=<INNER_PRIORITY>
OuterPriority=<OUTER_PRIORITY>
OutsidePriority=<OUTSIDE_PRIORITY>
오브젝트 개수 리미터
NetObjectCountLimiter 는 프레임마다 리플리케이션 대상으로 고려되는 오브젝트의 개수를 제한합니다.
오브젝트 개수 리미터 환경설정하기
DefaultEngine.ini 같은 엔진 환경설정 파일에서 NetObjectCountLimiter 를 환경설정할 수 있습니다.
[Script/Iris.NetObjectCountLimiterConfig]
MaxObjectCount=<MAX_COUNT>
Priority=<PRIORITY>
OwningConnectionPriority=<OWNER_PRIORITY>
bEnableOwnedObjectsFastLane=[true | false]
예를 들어, 디폴트 환경설정 세팅은 다음과 같습니다.
[Script/Iris.NetObjectCountLimiterConfig]
MaxObjectCount=2
Priority=1.0
OwningConnectionPriority=1.0
bEnableOwnedObjectsFastLane=true
커스텀 다이내믹 우선순위 지정자 생성하기
다음 위치에 있는 UNetObjectPrioritizer 인터페이스를 구현하여 커스텀 다이내믹 우선순위 지정자를 생성할 수 있습니다.
..\Engine\Source\Runtime\Experimental\Iris\Core\Public\Iris\ReplicationSystem\Prioritization\NetObjectPrioritizer.h
커스텀 다이내믹 우선순위 지정자 환경설정하기
리플리케이션 시스템에 커스텀 우선순위 지정자를 등록하려면, 엔진 환경설정 파일 계층구조에서 우선순위 지정자를 환경설정해야 하는데, 가급적이면 프로젝트의 DefaultEngine.ini 파일에서 환경설정하는 것이 좋습니다.
[/Script/IrisCore.NetObjectFilterDefinitions]
+NetObjectPrioritizerDefinitions=(PrioritizerName=<PRIORITIZER_NAME>, ClassName=/Script/<MODULE_NAME>.<PRIORITIZER_NAME>, ConfigClassName=/Script/<CONFIG_MODULE_NAME>.<PRIORITIZER_CONFIG_NAME>)
여기서
PRIORITIZER_NAME은 커스텀 우선순위 지정자의 이름입니다.MODULE_NAME은 우선순위 지정자가 정의되는 모듈의 이름입니다.CONFIG_NAME은 우선순위 지정자의 관련 환경설정이 정의되는 모듈의 이름입니다.PRIORITZER_CONFIG_NAME은 커스텀 우선순위 지정자 환경설정 클래스의 이름입니다.
설정하면 유효한 WorldLocation 이 있는 모든 오브젝트에 자동으로 사용되는 특별한 DefaultPrioritizer 가 있습니다.
커스텀 다이내믹 우선순위 지정자 사용하기
리플리케이트된 오브젝트에 커스텀 다이내믹 우선순위 지정자를 사용하려면 다이내믹 우선순위 지정자 지정하기의 단계를 따르고 3단계의 GetPrioritizerHandle 호출 시 해당 우선순위 지정자의 이름을 사용합니다.