자세한 액터 리플리케이션 흐름

로우 레벨 액터 리플리케이션에 대한 상세 설명입니다.

Choose your operating system:

Windows

macOS

Linux

액터 리플리케이션 대부분은 UNetDriver::ServerReplicateActors 안에서 일어납니다. 서버가 각 클라이언트에 연관성이 있다고 결정내린 액터 전부를 수집하고, 접속된 각 클라이언트가 지난 번 업데이트된 이후 변경된 프로퍼티가 있으면 전송하는 곳입니다.

이 프로세스 도중 액터가 업데이트되는 방식, 호출되는 특정 프레임워크 콜백, 사용되는 특정 프로퍼티에는 이미 정의된 흐름이 있습니다:

  • AActor::NetUpdateFrequency - 액터가 얼마나 자주 리플리케이트되는지 결정하는 데 사용됩니다.

  • AActor::PreReplication - 리플리케이션 발생 전 호출됩니다.

  • AActor::bOnlyRelevantToOwner - 이 액터가 오너에게만 리플리케이트되는 경우 true 입니다.

  • AActor::IsRelevancyOwnerFor - bOnlyRelevantToOwner = true 일 때 연관성 결정을 위해 호출됩니다.

  • AActor::IsNetRelevantFor - bOnlyRelevantToOwner = false 일 때 연관성 결정을 위해 호출됩니다.

하이 레벨 흐름은 이렇습니다:

  • 현재 리플리케이션중인 액터 각각에 대해 루프를 돌립니다 ( AActor::SetReplicates( true ) )

    • 이 액터가 애초에 휴면 상태인지 ( DORM_Initial ) 알아낸 다음, 그렇다면 즉시 건너뜁니다.

    • NetUpdateFrequency 값을 검사하여 이 액터를 업데이트해야 하는지 알아낸 다음, 아니면 건너뜁니다.

    • AActor::bOnlyRelevantToOwner = true 면, 소유 접속의 뷰어에서 AActor::IsRelevancyOwnerFor 를 호출하여 이 액터의 소유 접속에 연관성 검사를 합니다. 연관성이 있다면, 접속에서 소유된 연관성 (owned relevant) 목록에 추가합니다.

      • 이 경우, 이 액터는 하나의 접속에만 전송합니다.

    • 이러한 초기 검사를 통과한 액터에 대해서, AActor::PreReplication 를 호출합니다.

      • 접속에 대해 프로퍼티를 리플리케이트시킬지 결정할 수 있는 곳은 PreReplication 입니다. 여기에 DOREPLIFETIME_ACTIVE_OVERRIDE 를 사용하세요.

    • 위를 통과하면, 고려된(considered) 목록에 추가합니다.

  • 각 접속에 대해:

    • 위에서 고려된 액터 각각에 대해

      • 휴면 상태인지 알아냅니다.

      • 아직 채널이 없다면

        • 액터가 들어있는 레벨을 클라이언트가 로드했는지 알아냅니다.

          • 로드되지 않았다면, 건너뜁니다.

        • 접속에 대해 AActor::IsNetRelevantFor 를 호출하여 액터가 연관성이 있는지 알아냅니다.

          • 연관성이 없다면, 건너뜁니다.

    • 위에서 접속의 소유된 연관성 목록에 있는 액터를 추가합니다.

    • 이 시점에서, 이 접속에 연관성이 있는 액터 목록이 생겼습니다.

    • 액터를 우선권 순으로 정렬합니다.

    • 정렬된 각 액터에 대해:

      • 접속이 이 액터가 들어있는 레벨을 로드하지 않은 경우, (있다면) 채널을 닫고 계속합니다.

      • 1 초마다 AActor::IsNetRelevantFor 를 호출하여 액터가 접속에 연관성이 있는지 알아냅니다.

      • 5 초 동안 연관성이 없다면, 채널을 닫습니다.

      • 연관성이 있고 열린 채널이 없다면, 지금 엽니다.

      • 일정 시점에 이 접속이 포화된다면

        • 나머지 액터에 대해

          • 1 초 미만 연관성이 있다면, 다음 틱에 강제 업데이트합니다.

          • 1 초 이상 연관성이 있다면, AActor::IsNetRelevantFor 를 호출하여 다음 틱에 업데이트할지 알아냅니다.

      • 위 모든 것을 통과한 액터에 대해, UChannel::ReplicateActor 를 호출하여 액터를 접속에 리플리케이트합니다.

접속에 액터 리플리케이트하기

액터와 그 모든 컴포넌트를 접속에 리플리케이트하는 주역은 UChannel::ReplicateActor 입니다. 그 흐름은 다음과 같습니다:

  • 액터 채널이 열린 이후 첫 번째 업데이트인지 알아냅니다.

    • 그렇다면, 필요한 구체적인 정보를 (초기 위치, 회전 등) serialize 합니다.

  • 이 접속이 이 액터를 소유하는지 알아냅니다.

    • 소유하지 않고, 이 액터의 롤이 ROLE_AutonomousProxy 라면, ROLE_SimulatedProxy 로 다운그레이드합니다.

  • 이 액터의 변경된 프로퍼티를 리플리케이트합니다.

  • 각 컴포넌트의 변경된 프로퍼티를 리플리케이트합니다.

  • 삭제된 컴포넌트에 대해, 특수한 삭제 명령을 전송합니다.

언리얼 엔진 문서의 미래를 함께 만들어주세요! 더 나은 서비스를 제공할 수 있도록 문서 사용에 대한 피드백을 주세요.
설문조사에 참여해 주세요
건너뛰기