프로그래밍/UnrealEngine4

네트워크 동기화 기본 프로세스

ZenoAhn 2023. 12. 9. 13:41

NetDriver

네트워크 처리의 핵심

NetConnections 의 목록을 유지 관리

각 연결은 플레이어를 나타내며

클라이언트의 NetDriver는 서버에 대한 단일 연결을 관리

네트워크로부터 패킷을 수신, 패킷을 적절한 NetConnection으로 전달하는 일을 담당

패킷

패킷 메타데이터, Bunches로 구성

Bunche

채널간 전송되는 데이터
패킷이 수신되면, 개별 묶음으로 분할 된 다음, 개별 채널로 전달됨
패킷에는 번치가 포함되거나, 단일 번치가 포함되거나, 여러개의채널로 전달됨. 패킷에는 번치가 포함되지 않거나, 단일 번치가 포함되거나, 여러번 포함 될 수 있음
번치가 너무 크면, 전송에 여러개의 작은 번치로 분할되고 PartialInitial, Partial, PartialFinal로 표시됨

기본 개념

NetDriver

  • 서브클래스 IpNetDriver를 사용함.
  • NetDriver는 World 일대일 매칭
  • UE는 기본적으로 UDP 통신을 사용함
  • 주요 기능
    • Connection 관리, 생성
    • 데이터 패킷 전송 및 수신
    • CS 연결 초기화
    • Actor 동기화
    • RPC 관리
    • 소켓 관리
    • 서버 사이드
      • N개의 NetConnection 관리
    • 클라
      • 1개의 NetConnection 관리

NetConnection

네트워크 연결을 나타내며 NetDriver, PackageMap, UChannel배열 및 PlayerController에 연결됨

  • 서버 사이드
    • ClientConnection
  • 클라이언트 사이드
    • ServerConnection

채널 데이터

각 채널은 특정 유형 및 특정 인스턴스의 데이터 정보 교환만을 담당함

ControlChannel

CS간 제어 정보를 전송
주로 연결 및 연결 해제 관련 메세지를 주고 받음.
Connection이 초기화 될 때 하나만 생성됨

ActorChannel

액터 자체의 동기화뿐만 아니라 서브 컴포넌트, 프로퍼티, RPC 호출 등의 동기화를 포함하여 액터 자체와 관련된 정보의 동기화를 처리합니다. 커넥션 연결에서 동기화된 각 액터는 액터채널 인스턴스에 해당합니다.

VoiceChannel

음성 메시지 송수신에 사용되며, 연결에서 연결을 초기화할 때 이 채널의 인스턴스를 만듭니다.

PlayerController

UPlayer는 플레이어 컨트롤러와 연관되어 있으며, 그 서브클래스는 로컬 플레이어와 커넥션입니다. ??

World

게임 로직 관리 NetDriver를 구동, 액터 및 틱의 복제를 처리 ??

패킷

소켓으로부터 읽거나 쓰는 데이터.
하나의 패킷 안에 두개 이상의 Bunch데이터 또는 Ack데이터가 있을 수 있음

Bunch

논리적 상위 계층에서 배포된 동기화된 패킷으로 데이터가 불완전할 수 있으며, FNetBitWriter에서 상속된 AttributeBunch와 RPCBunch로 분류됨.

주로 채널 정보, NGUI, 완전한 Bunch인지 여부, 신뢰할 수 있는지 여부 등 기타 보조 정보를 기록함

Bunch는 AttributeBunch와 InBunch로 나뉘며, 채널에 수신한 데이터 스트림 문자열은 UNectConnection::ReceivedPacket이 생성 될 때 생성

OutBunch: 채널에서 받은 데이터 스트림으로 UActorChannel::ReplicateActor가 생성될 때 생성됨

ACk

Ack는 UDP의 안정적인 데이터 전송을 구현하기 위해 사용되는 Bunch와 동일한 개념의 네트워크 데이터 문자열입니다.

FSocket

플랫폼 소켓 기본 클래스
UPackageMap은 오브젝트와 NGUID의 매핑을 생성 및 유지 관리하며 오브젝트 직렬화를 담당합니다. 각 연결당 하나가 생성됨.

PacketHandler

암호화, 복호화, 핸드셰이크 등의 PacketHandler 내부에는 특별한 데이터 처리를 수행하는 하나 이상의 HandlerComponent가 있습니다. 현재 내장된 암호화 구성요소 RSA, AES 및 핸드셰이크 구성요소 StatelessConnectHandlerComponent

FObjectReplicator

속성 동기화 실행기, 각 Actorchannel은 FObjectReplicator에 해당하고 객체 인스턴스에 해당합니다. ActorChannel 채널 설정 시 생성됩니다.

FRepState

각 연결에 대해 동기화된 히스토리 데이터를 기록하고, FObjectReplicator에 존재하는 동기화 전 비교에 사용되는 Object 정보를 기록합니다.

FRepLayOut

동기화 속성 레이아웃 테이블은 현재 클래스에서 동기화해야 하는 모든 속성을 기록합니다. 각 클래스 또는 RPC 함수에는 하나의 속성이 있습니다.

FRepChangedPropertyTracker

속성 변경 추적 기록은 일반적으로 Actor를 동기화하기 전에 생성되며 Actor가 소멸되면 삭제됩니다.

FReplicationChangelistMgr

현재 개체 개체를 저장하고 속성 변경 내역을 저장합니다.

기본적인 통신 과정 과정

  1. UE 통신 프로토콜은 UDP를 사용하며, 서버와 클라이언트가 상대방의 IP 주소와 포트 번호만 알면 통신이 완료됩니다.
  2. 데이터 전송 및 수신은 기본적으로 게임 스레드(GT)에서 수행됩니다.
  3. 아래 그림은 서버에 연결된 두 클라이언트를 보여줍니다. 각 클라이언트에 대해 연결이 설정됩니다. 서버에서는 이 연결을 ClientConnection이라고 하고, 클라이언트에서는 이 연결을 ServerConnection이라고 합니다. 각 채널은 연결에 속하며 채널은 해당하는 클라이언트를 알고 있습니다.
  4. NetDriver는 소켓 데이터 패킷인 Packet을 수신한 후 IP와 Port를 기준으로 해당 Connection을 찾고, Connection은 Packet을 처리한 후 Bunch로 분할하여 Channel로 보내 처리합니다.

네트워크 Replication 흐름도

네트워크 데이터 수용 흐름도

  1. 클라이언트와 서버 모두에서 UNetDriver::TickDispatch는 일반적으로 네트워크 데이터 수신을 담당합니다.
  2. 패킷이 수신되면 해당 주소가 알려진 연결에서 왔는지 확인합니다.
  3. FInternetAddr에서 UNetConnection으로의 매핑을 저장하기만 하면 주어진 소스 주소에 대해 연결이 설정되었는지 여부를 확인할 수 있습니다.
  4. 패킷이 이미 설정된 연결에서 오는 경우 UNetConnection::ReceivedRawPacket을 통해 해당 연결로 패킷을 전달합니다.
  5. 패킷이 이미 설정된 연결에서 나오지 않으면 "연결 없음"으로 처리하고 핸드셰이크 프로세스를 시작합니다.

데이터 송수신 및 게임 루프

  1. 엔진이 시작되면 먼저 FEngineLoop::Init에 GEngine 객체를 생성하고 초기화를 위해 GEngine->Init를 호출한 다음 시작합니다.
  2. GameInstance 객체를 생성하고 초기화를 위해 InitializeStandalone을 호출하고 WorldContext 및 임시 DummyWorld를 생성합니다.
  3. GEngine->Start는 게임을 시작하고 GameInstance->StartGameInstance()를 호출합니다.
  4. 구성에서 맵 이름과 매개변수 호출을 읽습니다.
  5. UEngine::Browse는 기본 맵을 로드하고, 클라이언트는 서버에 연결하고, 서버는 모니터링을 시작합니다.
  6. 게임 엔진 전체 주기에서 네트워크 데이터 패킷의 송수신, 처리 과정이 이루어지는 지점이 아래 그림의 TickDispatch와 TickFlush에 있습니다.

'프로그래밍 > UnrealEngine4' 카테고리의 다른 글

Unreal Engine 4 Network Features  (0) 2018.06.02
UE 4.19 Contributors  (0) 2018.06.02
TPointerIsConvertableFromTo  (0) 2017.03.21
HTC Vive VR Preview 화면  (0) 2017.02.07
Unreal engine 4 SetActive  (0) 2017.01.31