아이리스 필터링 시스템(Iris Filtering System) 은 어떤 연결에 어떤 오브젝트가 리플리케이트되는지를 결정합니다. 게임에서 특정 연결에만 리플리케이트하고 싶은 액터나 오브젝트가 있을 수 있습니다. 필터링 시스템은 시간과 대역폭을 절약하기 위해 액터나 오브젝트가 리플리케이트될 수 있는 연결을 필터링합니다. 이 필터링 시스템은 다음 네 가지 필터링 타입을 지원합니다.
- 오너(Owner): 오브젝트가 해당 오너와 같은 연결에 리플리케이트됩니다.
- 연결(Connection): 오브젝트가 지정되고 허용된 연결에 리플리케이트되며, 지정되었지만 허용되지 않는 연결에는 리플리케이트되지 않습니다.
- 그룹(Group): 오브젝트가 소속 그룹의 모든 다른 오브젝트와 같은 연결에 리플리케이트됩니다.
- 다이내믹(Dynamic): 오브젝트가 커스텀 다이내믹 필터링에 따라 리플리케이트됩니다.
오너
bOnlyRelevantToOwner 플래그가 true 로 설정된 액터는 자동으로 오너 필터링이 활성화됩니다. 액터가 아닌 독립형 오브젝트에 대해서도 오너 필터링을 활성화할 수 있습니다.
오브젝트에 대해 오너 필터 설정하기
액터가 아닌 오브젝트에 대해 오너 필터링을 활성화하는 단계는 다음과 같습니다.
-
리플리케이트된 오브젝트에 대한
FNetRefHandle을 얻습니다. 아이리스는 이 식별자를 사용하여 리플리케이션 시스템 내에서 오브젝트를 찾습니다.#if UE_WITH_IRIS #include "Net/Iris/ReplicationSystem/ReplicationSystemUtil.h" #include "Net/Iris/ReplicationSystem/Filtering/NetObjectFilter.h" #endif UE_WITH_IRIS // 유효한 리플리케이트된 오브젝트 포인터 사용 FNetRefHandle ObjectHandle = UE::Net::FReplicationSystemUtil::GetNetHandle(RepActorPtr); -
오브젝트 리플리케이트를 담당하는 리플리케이션 시스템에 대한 레퍼런스를 얻습니다.
UReplicationSystem* ReplicationSystem = UE::Net::FReplicationSystemUtil::GetReplicationSystem(RepActorPtr); -
리플리케이트된 오브젝트에 대한 오너 필터 핸들을 설정합니다.
ReplicationSystem->SetFilter(ObjectNetHandle, UE::Net::ToOwnerFilterHandle);
오브젝트의 오너가 할당된 직후에 오너 필터를 할당해야 합니다.
모든 필터 지우기
리플리케이트된 오브젝트에서 모든 필터를 지우려면 먼저 오브젝트에 대해 오너 필터 설정하기의 1단계와 2단계를 진행한 다음, 다음과 같은 특수 필터 핸들을 사용하도록 필터를 설정합니다.
#if UE_WITH_IRIS
#include "Net/Iris/ReplicationSystem/ReplicationSystemUtil.h"
#include "Net/Iris/ReplicationSystem/Filtering/NetObjectFilter.h"
#endif UE_WITH_IRIS
UReplicationSystem* ReplicationSystem = UE::Net::FReplicationSystemUtil::GetReplicationSystem(RepActorPtr);
UE::Net::FNetRefHandle ObjectNetHandle = UE::Net::FReplicationSystemUtil::GetNetHandle(RepActorPtr);
// 유효하지 않은 특수 핸들로 필터를 설정합니다.
ReplicationSystem->SetFilter(ObjectNetHandle, UE::Net::InvalidNetObjectFilterHandle);
연결
연결 ID를 지정하여 오브젝트가 리플리케이트될 연결을 설정할 수 있습니다. 다음과 같은 경우에 이 옵션을 사용하는 것이 좋습니다.
- 문제의 오브젝트에 대해 허용되는 연결이 스태틱이고...
- 어떤 이유로 연결 ID가 변경되는 경우 몇 개의 오브젝트만 영향을 받는 경우
다수의 오브젝트가 영향을 받을 수 있다면 대신 그룹 필터링을 사용하는 것이 좋습니다. 연결 필터링을 사용하면 오브젝트에 허용되는 연결이나 허용되지 않는 연결을 추가할 수 있습니다.
연결 필터 설정하기
허용되는 연결을 추가하는 방법은 다음과 같습니다.
- 오브젝트 리플리케이트가 허용되는 모든 연결에 대해 비트를 설정합니다.
-
허용되는 최대 연결 수로 연결을 초기화한 후에 연결 필터를 설정합니다.
#if UE_WITH_IRIS #include "Net/Iris/ReplicationSystem/ReplicationSystemUtil.h" #include "Net/Iris/ReplicaitonSystem/Filtering/NetObjectFilter.h" #endif UE_WITH_IRIS UReplicationSystem* ReplicationSystem = UE::Net::FReplicationSystemUtil::GetReplicationSystem(RepActorPtr); UE::Net::FNetRefHandle ObjectNetHandle = UE::Net::FReplicationSystemUtil::GetNetHandle(RepActorPtr); TBitArray<> Connections; Connections.Init(false, MaxConnectionCount); UNetConnection* ConnId = PlayerControllerPtr->GetNetConnection(); Connections.SetBit(ConnId); ReplicationSystem->SetConnectionFilter(ObjectNetHandle, Connections, UE::Net::ENetFilterStatus::Allow);
비슷한 로직을 적용하여 허용되지 않는 연결을 추가할 수 있습니다. ENetFilterStatus::Allow 대신 ENetFilterStatus::Disallow 값을 사용합니다. 이 경우, 제공된 연결은 리플리케이트할 오브젝트에 대해 허용되지 않는 연결입니다.
연결 필터 지우기
오브젝트에 대한 연결 필터를 지우는 것은 오너 필터와는 다릅니다. 오브젝트에 대한 연결 필터를 지우려면 허용되지 않는 연결 필터를 설정하되 허용하지 않을 제공된 연결을 지정하지 않으면 됩니다.
#if UE_WITH_IRIS
#include "Net/Iris/ReplicationSystem/ReplicationSystemUtil.h"
#include "Net/Iris/ReplicationSystem/Filtering/NetObjectFilter.h"
#endif UE_WITH_IRIS
TBitArray<> NoConnections;
UReplicationSystem* ReplicationSystem = UE::Net::FReplicationSystemUtil::GetReplicationSystem(RepActorPtr);
UE::Net::FNetRefHandle ObjectNetHandle = UE::Net::FReplicationSystemUtil::GetNetHandle(RepActorPtr);
ReplicationSystem->SetConnectionFilter(ObjectNetHandle, NoConnections, UE::Net::ENetFilterStatus::Disallow);
그룹
아이리스에는 그룹을 생성하고 해당 그룹에 포함된 오브젝트를 관리하기 위한 API가 포함되어 있습니다. 그룹을 필터링 메커니즘으로도 사용할 수도 있습니다. 이 방법을 사용하면 어떤 오브젝트가 어떤 그룹에 속하는지 직접 추적할 필요 없이 오브젝트 세트가 리플리케이트될 수 있는 연결을 유연하게 변경할 수 있습니다. 이러한 사용 사례의 예시로는 다음을 기반으로 한 필터링이 있습니다.
- 팀(Team)
- 스쿼드(Squad)
- 스트리밍 레벨(Streaming Level)
하나의 오브젝트가 둘 이상의 그룹에 속할 수 있습니다. 리플리케이션 대상으로 고려하려면 해당 그룹을 필터링 시스템에 추가해야 합니다. 그룹을 추가하고 나면 그룹 멤버가 리플리케이트될 수 있는 연결을 수정할 수 있습니다. 다음에 대한 리플리케이션을 허용하거나 허용하지 않도록 그룹을 설정할 수 있습니다.
- 단일 연결
- 연결 세트
- 모든 연결
그룹 생성하기
필터 그룹을 생성하려면 고유한 그룹 핸들을 반환하는 CreateGroup 함수를 호출합니다.
#if UE_WITH_IRIS
#include "Net/Iris/ReplicationSystem/ReplicationSystemUtil.h"
#endif UE_WITH_IRIS
UReplicationSystem* ReplicationSystem = UE::Net::FReplicationSystemUtil::GetReplicationSystem(RepActorPtr);
FNetObjectGroupHandle GroupHandle = ReplicationSystem->CreateGroup();
그룹 필터 추가하기
필터 상태를 설정하고 오브젝트를 추가하기 전에 필터링 시스템에 그룹 필터를 추가해야 합니다.
#if UE_WITH_IRIS
#include "Net/Iris/ReplicationSystem/ReplicationSystemUtil.h"
#endif UE_WITH_IRIS
// 유효한 FNetObjectGroupHandle을 추가합니다.
ReplicationSystem->AddGroupFilter(GroupHandle);
그룹 필터링 설정하기
그룹을 생성하고 그룹 필터를 리플리케이션 시스템에 추가한 다음에는 그룹 필터링을 설정할 수 있습니다. 이 예시에서 GroupHandle 핸들이 있는 그룹에 속한 모든 오브젝트는 ID가 SpecialConnectionId 인 연결에 대해서만 리플리케이트가 허용됩니다.
#if UE_WITH_IRIS
#include "Net/Iris/ReplicationSystem/Filtering/NetObjectFilter.h"
#endif UE_WITH_IRIS
// 유효한 FNetObjectGroupHandle 및 UNetConnection 사용*
ReplicationSystem->SetGroupFilterStatus(GroupHandle, SpecialConnectionId, UE::Net::ENetFilterStatus::Allow);
그룹에 오브젝트 추가하기
이제 그룹에 원하는 오브젝트를 추가할 수 있습니다.
#if UE_WITH_IRIS
#include "Net/Iris/ReplicationSystem/Filtering/NetObjectFilter.h"
#endif UE_WITH_IRIS
// 유효한 FNetObjectGroupHandle 및 FNetHandle 사용
ReplicationSystem->AddToGroup(GroupHandle, ObjectNetHandle);
다이내믹
아이리스 필터링 시스템은 UNetObjectFilter 파생 클래스로 커스텀 다이내믹 필터링도 구현할 수 있습니다. 다이내믹 필터는 커스텀 로직에 따라 오브젝트가 리플리케이트되지 않도록 제한할 수 있습니다. 다이내믹 필터는 연결 및 그룹 필터 다음에 적용됩니다. 즉, 다이내믹 필터는 이미 연결 또는 그룹 필터로 필터링된 오브젝트에 대한 리플리케이션을 활성화할 수 없습니다. 오브젝트에는 한 번에 하나의 다이내믹 필터만 설정할 수 있습니다.
다이내믹 필터는 항상 오브젝트에서 실행되는 반면, 연결 및 그룹 필터는 시스템에 변경사항이 통지될 때만 실행됩니다. 이는 다이내믹 필터는 어떤 방식으로든 구현될 수 있기에 시스템이 다이내믹 필터 실행 여부를 알 수 있는 방법이 없기 때문입니다. 다이내믹 필터가 최적의 솔루션을 제공하는 상황이 있습니다. 그룹 간에 액터를 이동하거나 그룹이 리플리케이트될 수 있는 연결을 변경하는 등, 그룹을 자주 수정하는 경우 다이내믹 필터가 최적의 솔루션을 제공할 수 있습니다.
오브젝트에 대한 다이내믹 필터는 최후의 수단으로만 설정해야 합니다. 왜냐하면 연결 필터나 그룹 필터에 비해 상당한 CPU 오버헤드가 추가되기 때문입니다.
UE는 ..\Engine\Source\Runtime\Experimental\Iris\Core\Public\Iris\ReplicationSystem\Filtering\ 디렉터리에서 몇 가지 다이내믹 필터를 제공합니다.
UFilterOutNetObjectFilter: 추가된 모든 오브젝트의 리플리케이션을 허용하지 않습니다.UNetObjectConnectionFilter: 종속 오브젝트에 대한 연결별 필터를 지원하는 사전 폴링 필터입니다.UNetObjectGridFilter: 게임 월드를 셀로 나누고 플레이어의 뷰 근처에 있는 셀의 오브젝트만 리플리케이트합니다.
커스텀 다이내믹 필터를 사용하려면 UNetObjectFilter 인터페이스를 구현해야 하며, 런타임 시 사용하려면 필터 정의로 환경설정해야 합니다.
다이내믹 필터 생성하기
커스텀 다이내믹 필터를 사용하려면 UNetObjectFilter 인터페이스를 구현하고 런타임 시 필터를 사용하도록 필터 정의를 환경설정합니다. 커스텀 필터가 상속받아야 하는 베이스 클래스는 다음 파일 경로에 있습니다.
..\Engine\Source\Runtime\Experimental\Iris\Core\Public\Iris\ReplicationSystem\Filtering\NetObjectFilter.h
커스텀 다이내믹 필터의 최소 작동 예시는 다음 경로에 있습니다.
..\Engine\Source\Runtime\Experimental\Iris\Core\Public\Iris\ReplicationSystem\Filtering\NopNetObjectFilter.h
다이내믹 필터 환경설정
다음은 커스텀 다이내믹 필터를 사용하기 위한 엔진 환경설정 구문입니다.
[/Script/IrisCore.NetObjectFilterDefinitions]
+NetObjectFilterDefintions=(FilterName=<FILTER_NAME>, ClassName=/Script/<PROJECT_NAME>.<FILTER_NAME>, ConfigClassName=/Script/<PROJECT_NAME>.<FILTER_NAME>Config)
예를 들어, MyProject 라는 프로젝트의 MyCustomFilter 라는 커스텀 다이내믹 필터는 프로젝트의 DefaultEngine.ini 파일 같은 엔진 환경설정 계층구조에서 다음과 같이 환경설정됩니다.
[/Script/IrisCore.NetObjectFilterDefinitions]
+NetObjectFilterDefintions=(FilterName=MyCustomFilter, ClassName=/Script/MyProject.MyCustomFilter, ConfigClassName=/Script/MyProject.MyCustomFilterConfig)
필터가 아이리스에 등록된 다음에는 프로젝트의 DefaultEngine.ini 파일 같은 엔진 환경설정 파일에서 다음과 같이 필터를 환경설정할 수 있습니다.
[/Script/MyProject.MyCustomFilterConfig]
MyCustomFilterVar=100
다이내믹 필터에 오브젝트 할당하기
다이내믹 필터를 리플리케이트된 오브젝트에 할당하려면 다음 스크립트를 사용합니다.
const UE::Net::FNetObjectFilterHandle FilterHandle = ReplicationSystem->GetFilterHandle(FName("<FILTER_NAME>"));
if (FilterHandle != UE::Net::InvalidNetObjectFilterHandle)
{
const bool bSuccess = ReplicationSystem->SetFilter(ObjectNetHandle, FilterHandle);
}
다이내믹 필터 제거하기
다이내믹 필터는 오너 필터와 같은 방식으로 제거합니다. 필터 제거 방법은 이 페이지의 모든 필터 지우기 섹션을 참조하세요.