아이리스(Iris) 는 언리얼 엔진(UE)의 일반 리플리케이션 시스템과 최대한 하위 호환성을 유지합니다. 그렇지만, 두 시스템 간의 핵심적인 차이점을 수용하기 위해 게임플레이 코드를 변경해야 할 수도 있습니다.
아이리스의 핵심 설계 원칙 중 하나는 리플리케이션 시스템과 게임플레이 코드 간의 인터랙션 횟수를 최소화하는 것입니다. 이러한 목적으로 아이리스는 가상 함수 호출 횟수를 줄입니다. 일반 시스템의 이러한 가상 함수 호출은 아이리스 리플리케이션 시스템을 통해 API 함수를 명시적으로 호출하는 것으로 대체됩니다.
아래 표에는 다음과 같은 내용이 나와 있습니다.
- 기존 리플리케이션 시스템의 기능
- 아이리스에서 해당 기능이 변경되었는지 여부
- 시스템이 변경된 경우 그에 해당하는 아이리스 기능
- 자세한 내용을 확인할 수 있는 문서 페이지 링크
| 기존 리플리케이션 기능 | 아이리스에서 변경됨 | 아이리스 리플리케이션 기능 |
|---|---|---|
| 휴면 상태 | ||
| 우선순위 | ✓ | 아이리스 우선순위 지정 |
| 프로퍼티 리플리케이션 | ||
| 연관성 | ✓ | 아이리스 필터링 |
| 원격 프로시저 호출 | ||
| 서브오브젝트 리플리케이션 | ✓ | 아이리스 서브오브젝트 리플리케이션 |
위의 표에서 아이리스에서 변경됨으로 표시되지 않은 기능은 일반 리플리케이션 시스템에서와 동일하게 작동합니다.
푸시 모델
아이리스는 완전한 푸시 기반으로 설계되었습니다. 아이리스를 푸시 모델 리플리케이션 없이 사용할 수도 있습니다. 특정 오브젝트에 대해 푸시 모델 리플리케이션이 활성화되지 않은 경우, 아이리스는 자동으로 NetUpdateFrequency 를 기반으로 한 오브젝트 폴링으로 돌아갑니다. 기본적으로 아이리스는 표준 푸시 모델 세팅을 따릅니다.
리플리케이트된 프로퍼티
리플리케이트된 프로퍼티는 일반 리플리케이션 시스템에서와 동일하게 작동합니다. UE에서 리플리케이트된 프로퍼티가 작동하는 방식에 대한 자세한 내용은 액터 프로퍼티 리플리케이트 문서를 참조하세요.
원격 프로시저 호출
아이리스에서 원격 프로시저 호출(Remote Procedure Call, RPC) 선언 및 실행은 일반 리플리케이션 시스템 및 리플리케이션 그래프에서와 동일하게 작동합니다. RPC 및 리플리케이트된 프로퍼티 업데이트가 수신 머신에서 실행되는 방식에 대한 자세한 내용은 리플리케이션 실행 순서 문서를 참조하세요.
서브오브젝트 리플리케이션
아이리스를 사용하려면 등록된 서브오브젝트 목록 을 활성화해야 합니다. 액터 클래스에 대해 등록된 서브오브젝트 목록을 사용하려면 다음 내용을 리플리케이트된 액터의 생성자에 추가합니다.
bReplicateUsingRegisteredSubObjectList = true;
아이리스를 사용하는 경우, AActor 또는 UActorComponent 에서 파생되지 않은 리플리케이트된 서브오브젝트는 리플리케이트된 프로퍼티와 함수를 등록하는 가상 함수 RegisterReplicationFragments 도 구현해야 합니다. UObject 파생 클래스 UMyDerivedObject 에 대한 RegisterReplicationFragments 를 구현하려면, 다음 코드를 MyDerivedObject.h 및 MyDerivedObject.cpp 파일에 각각 추가합니다.
MyDerivedObject.h
#if UE_WITH_IRIS
// 리플리케이션 프래그먼트 등록
virtual void RegisterReplicationFragments(UE::Net::FFragmentRegistrationContext& Context, UE::Net::EFragmentRegistrationFlags RegistrationFlags) override;
#endif // UE_WITH_IRIS
MyDerivedObject.cpp
#if UE_WITH_IRIS
#include "Iris/ReplicationSystem/ReplicationFragmentUtil.h"
#endif // UE_WITH_IRIS
#if UE_WITH_IRIS
void UMyDerivedObject::RegisterReplicationFragments(UE::Net::FFragmentRegistrationContext& Context, UE::Net::EFragmentRegistrationFlags RegistrationFlags)
{
// 디스크립터를 빌드하고 이 오브젝트에 대한 PropertyReplicaitonFragments 할당
UE::Net::FReplicationFragmentUtil::CreateAndRegisterFragmentsForObject(this, Context, RegistrationFlags);
}
#endif // UE_WITH_IRIS
리플리케이트된 서브오브젝트에 대한 자세한 내용은 리플리케이트된 서브오브젝트 문서를 참조하세요.
커스텀 네트워크 시리얼라이저
아이리스는 네트워크 시리얼라이제이션을 위해 리플리케이트된 프로퍼티로 사용할 수 있는 모든 언리얼 엔진 프리미티브 타입을 지원합니다. 구조체가 커스텀 NetSerialize 메서드를 사용하는데 아이리스 특정 구현이 누락된 경우, 다음 경고가 기록됩니다.
경고: 커스텀 시리얼라이제이션이 있는 STRUCT_NAME 구조체에 대한 디스크립터를 생성합니다(Warning: Generating descriptor for struct STRUCT_NAME that has custom serialization).
NetSerialize 메서드의 데이터가 프로퍼티 네트워크 시리얼라이즈 메서드만 사용하여 리플리케이트될 수 있는 경우, 프로젝트의 DefaultEngine.ini 파일에 다음 항목을 추가하여 경고가 표시되지 않게 할 수 있습니다.
DefaultEngine.ini
[/Script/IrisCore.ReplicationStateDescriptorConfig]
; 구조체에 대한 커스텀 NetSerialize 함수가 있더라도 리플렉션 기반 구조체 시리얼라이즈를 사용하여 작동하도록 검증된 구조체를 선언합니다.
+SupportsStructNetSerializerList=(StructName=STRUCT_NAME)
빠른 배열 리플리케이션
아이리스는 기존의 빠른 배열 정의를 지원합니다. 또한, 아이리스는 IrisFastArraySerializer.h 에 있는 특수 빠른 배열 시리얼라이저 FIrisFastArraySerializer` 도 지원합니다.
P2P
아이리스는 언리얼 엔진 리슨 서버를 지원합니다. 리슨 서버를 사용하면 게임 인스턴스가 멀티플레이어 게임 세션의 호스트 역할을 하면서 자체 로컬 플레이어도 지원할 수 있습니다.
리플리케이션 그래프 관련 차이점
리플리케이션 그래프 플러그인은 리플리케이트할 퍼시스턴트 오브젝트 목록을 포함하는 노드를 기반으로 빌드된 네트워크 리플리케이션 시스템입니다. 아이리스는 리플리케이션 그래프를 지원하지 않습니다. 아이리스 및 리플리케이션 그래프는 별개의 시스템이며, 네트워크 드라이버는 둘 중 하나만 사용할 수 있습니다. 아이리스는 액터가 리플리케이트되는 시점과 위치를 제어하는 리플리케이션 그래프와 같은 의미의 노드 콘셉트가 없습니다. 대신, 새로운 네트워크 오브젝트 필터와 우선순위 지정자가 리플리케이션 그래프의 함수 기능을 대체합니다. 자세한 내용은 필터링 및 우선순위 지정 문서를 참조하세요.