아이리스 리플리케이션 시스템 은 언리얼 엔진(UE) 에 있는 아이리스를 위한 주요 인터페이스입니다. 아이리스는 모든 리플리케이트된 스테이트 데이터의 전체 사본을 양자화된 형태로 유지하여, 게임플레이 시스템과 리플리케이션 시스템 간의 종속성을 최소화합니다. 아이리스는 비용이 높은 연산을 한 번만 수행하고 연결 간에 작업을 공유하므로, 시스템에서 더 많은 작업을 병렬로 수행할 수 있습니다. 이러한 병렬 작업으로 시간과 리소스를 절약할 수 있습니다.
이 페이지에서 다루는 내용은 다음과 같습니다.
- 리플리케이션 브리지 및 리플리케이션 시스템에 액세스하는 방법에 대한 지침
- 아이리스가 오브젝트를 리플리케이트하는 내부 작동 방식에 대한 개요
인터페이스
아이리스 리플리케이션 시스템 인터페이스는 리플리케이션 시스템 자체를 관리할 수 있게 해주며, 다음 요소를 제어하는 함수도 제공합니다.
- 연결
- 그룹
- 우선순위 지정
- 필터링
- 원격 프로시저 호출
모든 아이리스 인터페이스 함수는 리플리케이션 브리지를 통해 생성된 넷 레퍼런스 핸들( FNetRefHandle )에서 작동합니다. net ref handle 은 아이리스 리플리케이션 브리지에 의해 생성된 식별자입니다. 넷 레퍼런스 핸들은 네트워크 오브젝트를 생성 중 제공되는 연관된 게임플레이 인스턴스( UObject , UActorComponent 또는 AActor )에 고유하게 매핑해 주는 키입니다.
아이리스를 설명하는 데 사용되는 용어와 관련된 추가 정보는 아이리스 용어집 문서 페이지를 참조하세요.
리플리케이션 브리지
아이리스 리플리케이션 브리지는 액터와 같이 게임플레이 인스턴스 오브젝트에서 작동하는 모든 함수 기능을 담당합니다. 리플리케이션 브리지는 게임플레이 코드와 내부 아이리스 리플리케이션 시스템 사이에 위치합니다. 이 브리지가 아이리스 리플리케이션 시스템과 게임플레이 코드 간 스테이트 데이터의 통신과 관련된 아이리스 내 모든 연산을 위한 중앙 채널이 됩니다.
전송 머신에서 리플리케이션 브리지는 네트워크 오브젝트의 수명과 리플리케이션 시스템에 필요한 프로토콜을 관리합니다. 리플리케이션 브리지를 사용하여 리플리케이트된 오브젝트를 위한 넷 레퍼런스 핸들을 가져올 수 있습니다. 그런 다음 넷 레퍼런스 핸들과 리플리케이션 시스템을 사용하여 오브젝트의 리플리케이션 설정을 커스터마이징합니다.
수신 머신에서 리플리케이션 브리지는 액터 인스턴스화와 수명 관리를 담당합니다.
구체적으로 보면, 리플리케이션 브리지는 다음과 같은 작업을 수행합니다.
BeginReplication및EndReplication으로 리플리케이트된 오브젝트의 리플리케이션을 시작하고 종료합니다.- 리플리케이션 프로토콜 및 리플리케이션 인스턴스 프로토콜 생성을 수행합니다.
- 오브젝트 인스턴스화에 필요한 데이터를 시리얼라이즈 및 디시리얼라이즈합니다.
- 리플리케이션 시스템을 위해 게임 측에서 오브젝트를 인스턴스화합니다.
- 게임플레이 인스턴스와 넷 레퍼런스 핸들 간의 매핑을 처리합니다.
리플리케이션 브리지의 관련 헤더 파일에는 다음이 포함되어 있습니다.
..\Engine\Source\Runtime\Engine\Public\Net\Iris\ReplicationSystem\ActorReplicationBridge.h..\Engine\Source\Runtime\Experimental\Iris\Core\Public\Iris\ReplicationSystem\ObjectReplicationBridge.h
리플리케이션 컨트롤
오브젝트를 리플리케이트하기 위해 아이리스는 먼저 오브젝트의 네트워크 표현을 생성합니다. 리플리케이션 브리지가 BeginReplication 에서 넷 오브젝트 및 넷 레퍼런스 핸들의 생성을 관리합니다.
리플리케이션 시작
BeginReplication 중에는 아이리스가 오브젝트와 연관된 리플리케이트된 데이터의 모든 측면을 설명하는 리플리케이션 프로토콜을 구성합니다. 이 리플리케이션 프로토콜이 동일한 타입의 모든 인스턴스에 공유됩니다. 오브젝트의 각 인스턴스마다 리플리케이션 시스템은 인스턴스별 데이터를 포함하는 리플리케이션 인스턴스 프로토콜을 생성합니다. 인스턴스별 데이터는 이 특정 인스턴스에 대해 리플리케이트해야 하는 데이터를 찾을 위치와, 수신된 데이터를 푸시할 위치를 포함하고 있습니다.
리플리케이션 브리지 액세스
아이리스가 리플리케이트된 오브젝트를 위한 넷 레퍼런스 핸들을 생성하고 나면, 리플리케이션 시스템 API를 사용하여 오브젝트의 리플리케이션 방식을 제어할 수 있게 됩니다. 리플리케이트된 오브젝트의 넷 레퍼런스 핸들을 가져오려면 다음 단계를 따릅니다.
-
다음과 같은 필수 아이리스 파일을 추가합니다.
#if UE_WITH_IRIS #include "Net/Iris/ReplicationSystem/ReplicationSystemUtil.h" #include "Net/Iris/ReplicationSystem/ActorReplicationBridge.h" #endif UE_WITH_IRIS -
다음과 같이 액터의 리플리케이션 브리지에 대한 레퍼런스를 찾아옵니다.
// 해당 넷 레퍼런스 핸들을 가져오고자 하는 액터입니다. AActor* RepActorPtr; UActorReplicationBridge* ReplicationBridge = UE::Net::FReplicationSystemUtil::GetActorReplicationBridge(RepActorPtr); -
리플리케이트된 액터의 넷 레퍼런스 핸들을 가져옵니다.
UE::Net::FNetRefHandle RepActorNetRefHandle = ReplicationBridge->GetReplicatedRefHandle(RepActorPr); // 이제 리플리케이션 시스템을 찾아와 API 작업을 수행할 수 있습니다.
리플리케이션 종료
EndReplication 중에는 리플리케이션 시스템이 게임플레이 오브젝트에 대해 생성된 네트워킹 리소스를 모두 지우고 오브젝트의 리플리케이션을 중단합니다.
스테이트 트래킹
아이리스는 수행할 작업이 있을 때 게임에서 리플리케이션 시스템에 알림을 전달하는 경우 최적으로 작동하게 됩니다. 아이리스는 리플리케이션 시스템이 폴링을 통해 변경사항을 확인할 것으로 예상하지 않습니다. 리플리케이션 시스템은 리플리케이트된 프로퍼티가 수정될 때마다 알림을 받을 것으로 예상합니다. 이러한 수정 시스템을 효율적으로 구현하기 위해, 아이리스의 모든 리플리케이트된 변수는 리플리케이션 스테이트의 일부로 존재합니다. replication state 는 네트워크에서 리플리케이트되거나 전송되어야 하는 구조 포함 데이터입니다.
리플리케이션 스테이트에는 멤버의 더티 상태를 트래킹하는 비트필드를 위한 할당 공간이 있습니다. 멤버의 스테이트가 변경되는 경우 멤버는 dirty 가 되지만, 변경사항이 다운스트림 시스템에 아직 전달되지는 않습니다. 또한 리플리케이션 스테이트에는 오브젝트에 업데이트가 필요한 더티 스테이트 데이터가 있음을 리플리케이션 시스템에 알리는 임베드된 식별자도 있습니다.
리플리케이션 시스템
리플리케이션 시스템은 아이리스의 리플리케이트된 오브젝트와 상호작용하기 위한 주요 API입니다. 리플리케이션 브리지를 통해 상호작용하고자 하는 오브젝트의 넷 레퍼런스 핸들을 가져온 경우, 오브젝트의 리플리케이션 비헤이비어를 커스터마이징할 수 있습니다. 오브젝트가 리플리케이트할 연결 필터링 또는 오브젝트의 리플리케이션 우선순위 업데이트와 같은 방식으로 커스터마이징이 가능합니다.
리플리케이션 시스템 액세스
리플리케이트된 오브젝트에 사용되는 리플리케이션 시스템에 액세스하는 방법은 다음과 같습니다.
-
다음과 같은 필수 아이리스 파일을 추가합니다.
#if UE_WITH_IRIS #include "Net/Iris/ReplicationSystem/ReplicationSystemUtil.h" #endif UE_WITH_IRIS -
게임플레이 코드에서 리플리케이트된 오브젝트의 리플리케이션 시스템을 찾아옵니다.
// 해당 넷 레퍼런스 핸들을 가져오고자 하는 액터입니다. AActor* RepActorPtr; UReplicationSystem* ReplicationSystem = UE::Net::FReplicationSystemUtil::GetReplicationSystem(RepActorPtr);
리플리케이션 시스템의 관련 헤더 파일에는 다음이 포함되어 있습니다.
..\Engine\Source\Runtime\Engine\Public\Net\Iris\ReplicationSystem\ReplicationSystemUtil.h..\Engine\Source\Runtime\Experimental\Iris\Core\Public\Iris\ReplicationSystem\ReplicationSystem.h
리플리케이트된 오브젝트의 리플리케이션을 커스터마이징하는 방법에 대한 예시는 필터링 및 우선순위 지정 문서를 참조하세요.
리플리케이션 시스템의 프로세스 플로
이 섹션에서는 아이리스의 내부 작동 프로세스 플로와 아이리스의 다양한 컴포넌트가 함께 작동하는 방식에 대해 설명합니다.
프로세스 플로는 하나의 전송 머신과 하나 이상의 수신 머신으로 구성됩니다. 전송 머신은 전송자가 멀티플레이어 세션에서 연결된 다른 머신에 전달해야 하는 리플리케이트된 오브젝트에 대한 새 정보를 갖고 있습니다. 전송 머신의 리플리케이션 프로세스는 전송 전 업데이트와 전송 업데이트, 총 2단계로 이뤄집니다. 오래된 정보를 갖고 있는 연결된 머신이 바로 수신 머신으로, 전송 머신의 스테이트와 일치하도록 리플리케이트된 오브젝트 관련 정보를 업데이트해야 합니다.
넷 시리얼라이저와 데이터 스트림이 전송 머신과 수신 머신 간 데이터 전달 프로세스에 사용됩니다. 넷 시리얼라이저는 네트워크를 통한 효율적인 전송을 위해 데이터를 트랜스폼합니다. 데이터 스트림은 특별한 전달 보장 방식을 포함하여 데이터가 전송되는 방식을 정의합니다.
전송 머신
전송 전 업데이트
리플리케이션 시스템의 발신 측 전송 전 업데이트에서는 대량의 공유 작업이 이루어집니다. 또한 이때가 시스템에서 게임플레이 코드의 데이터에 액세스하는 유일한 순간이기도 합니다. 이 업데이트는 다음과 같은 단계로 구성됩니다.
- 레거시 모드로 실행되는 경우, 스테이트 변경을 확인하기 위해 리플리케이트된 오브젝트를 폴링합니다.
- 모든 더티 스테이트 데이터를 복제하고 양자화합니다.
- 리플리케이트된 오브젝트의 더티 상태를 리셋합니다.
- 넷 오브젝트의 필터링 상태를 업데이트합니다.
- 넷 오브젝트의 우선순위 지정을 업데이트합니다.
전송 업데이트
패킷 데이터를 채울 때 리플리케이션 시스템 내에 포함되지 않은 어떠한 데이터도 건드리지 않아야 합니다. 이렇게 해야 캐시를 적절히 사용하면서, 더 쉽게 태스크를 동시에 완료할 수 있습니다. 전송 업데이트 프로세스는 모든 연결에서 다음과 같이 진행됩니다.
- 모든 데이터 스트림을 티킹하여 패킷을 생성하고 채웁니다.
- 리플리케이션 데이터 스트림:
- 오브젝트 우선순위와 스케줄링 우선순위에 따라 더티 스테이트인 오브젝트가 전송되도록 예약합니다.
- 우선순위와 종속성을 기준으로 정렬합니다.
- 스테이트 데이터를 시리얼라이즈합니다.
- 리플리케이션 데이터 스트림:
수신 머신
모든 연결에서, 패킷을 수신하는 측에서는 들어오는 패킷을 다음과 같이 처리합니다.
- 먼저 전달 알림을 업데이트합니다.
- 데이터 스트림이 각 패킷에 포함된 데이터를 처리합니다.
- 리플리케이션 데이터 스트림:
- 스테이트 데이터 읽기: 스테이트 데이터는 전체 패킷을 읽은 후 디스패치됩니다. 리플리케이션 시스템은 리플리케이션 프로토콜 빌드 시 새 오브젝트에 의존하므로, 새 오브젝트는 즉시 인스턴스화됩니다.
- 스테이트 데이터 디스패치: 리플리케이션 시스템이 새로운 데이터를 게임으로 푸시하여 게임플레이 오브젝트를 업데이트합니다.
- 리플리케이션 데이터 스트림:
추가 정보
액터의 리플리케이션 비헤이비어를 변경하는 방법에 대한 예시를 비롯하여, 아이리스 리플리케이션 시스템의 컴포넌트에 대한 자세한 내용은 이 섹션의 다른 문서 페이지를 참조하세요.