Unreal Detailed Actor Replication Flow

tttkim·2021년 7월 30일

Unreal

목록 보기
1/1

액터 replication은 UNetDriver::ServerReplicateActors 안에서 일어난다. 이곳이 서버가 클라이언트와 관련 있는 것으로 설정된 모든 액터를 모아두는 곳이고, 연결된 클라이언트가 마지막으로 업데이트된 뒤의 변동사항을 전송하는 곳이다.

액터가 어떻게 업데이트되는지, 특정 프레임워크 콜백이 어떻게 일어나는지, 그 과정에서 어떤 프로퍼티가 사용되는지를 규정한 흐름이 존재한다.

중요한 부분

  • AActor::NetUpdateFrequency : 액터가 얼마나 자주 replicate되는 지 설정
  • AActor::PreReplication : replication이 일어나기 전에 호출됨
  • AActor::bOnlyRelevantToOwner : 액터가 소유자에게만 replicate되면 true
  • AActor::IsRelevancyOwnerFor : bOnlyRelevantToOwner가 true일 경우 relevancy를 설정하기 위해 호출됨
  • AActor::IsNetRelevantFor : bOnlyRelevantToOwner가 false일 경우 relevancy를 설정하기 위해 호출됨

대략적인 흐름은 다음과 같다 :

  • replicate되는 모든 액터(AActor::SetReplicates(true))를 순회.
    • 액터가 비활성화되어있다면(DORM_Initial) 바로 건너뜀.
    • NetUpdateFrequency 값을 확인해 액터가 업데이트되어야 하는지 확인하고, 아니면 건너뜀.
    • AActor::bOnlyRelevantToOwner가 true일 경우, AActor::IsRelevancyOwnerFor를 호출하여 액터의 소유 관계를 확인. 만약 relevant하다면, 연결의 relevant 리스트에 추가.
      • 이 경우, 액터는 단일 연결에만 전송될 것.
    • 위의 초기 확인 절차를 통과한 액터마다 AActor::PreReplication이 호출됨
      • PreReplication은 프로퍼티가 replicate될지 여부를 결정하는 장소임. DOREPLIFETIME_ACTIVE_OVERRIDE를 사용할 것.
    • 위의 절차를 모두 통과하면 액터를 considered 리스트에 추가.
  • 각각의 연결마다:
    • 각각의 considered 리스트에 있는 actor마다
      • 비활성화시킬지 결정
      • 채널이 아직 없다면
        • 클라이언트가 액터가 포함된 레벨을 로드했는지 확인하고, 로드하지 않았다면 건너뜀
        • 액터가 relevant한지 AActor::IsNetRelevantFor를 호출해 확인하고, relevant하지 않다면 건너뜀
    • 연결에 있는 모든 액터를 relevant list에 추가
    • 이 시점에서, 이 연결과 relevant한 액터 리스트를 가지게 됨
    • 액터를 우선순위에 따라 정렬
    • 각각의 정렬된 액터마다:
      • 연결에서 해당 액터가 포함된 레벨이 로드되지 않았을 경우, 채널이 있다면 닫고 다음으로 진행함
      • 매 초마다 AActor::IsNetRelevantFor를 호출해 액터가 연결에 relevant한지를 확인
      • 5초간 relevant하지 않다면 채널을 닫음
      • relevant하고 열려있는 채널이 없다면 채널을 염
      • 연결이 포화상태일 경우
        • 남아있는 액터들에 대해 :
          • 1초 이하로 relevant하다면 강제로 다음 틱을 업데이트
          • 1초 이상 relevant하다면 AActor::IsNetRelevantFor를 호출해 다음 틱을 업데이트해야 하는지 결정
      • 위의 모든 과정을 통화한 액터는 UChannel::ReplicateActor를 호출해 연결에 replicate됨

Replicating an Actor to a Connection

  • UChannel::ReplicateActor가 액터와 컴포넌트들을 replicate하는 일꾼임. 다음과 같은 과정을 통해 진행됨.
    • 액터 채널이 열리고 나서 첫 업데이트인지 확인하고, 첫 업데이트라면 그에 필요한 세부 정보(초기 위치, 회전값 등)를 serialize함.
    • 연결이 해당 액터를 소유하는지 확인하고, 소유하고있지 않고 액터의 역할이 ROLE_AutonomousProxy라면, ROLE_SimulatedProxy로 다운그레이드 시킴.
  • 액터의 변경된 프로퍼티를 replicate
  • 각 컴포넌트의 변경된 프로퍼티를 replicate
  • 삭제된 컴포넌트에 대해서는 특수한 삭제 명령을 전송
profile
Daily Struggling

0개의 댓글