우선권이란?
우선권을 설정할 때 대역폭보다 커서 전송하지 못한 후순위의 액터를 다음 틱에서 전송할 방법이 필요한데 그것이 우선권 설정이다.
우선권 설정 로직
액터의 휴면 이란?
flushnetdormancy() 함수를 통해 휴면 해제가 가능하다.
네트웍 트래픽 포화(Saturation) 예시
위와 같이 우선순위가 밀려 전송되지 못한 패킷은 다음 틱에 전송된다.
액터 리플리케이션의 흐름
액터 리플리케이션을 진행할 때 가장 먼저 진행되는 것이 네트워크로 업데이트할 액터의 목록이다.
서버가 매 틱마다 이들을 클라이언트로 전송하는데 각 액터의 정보는 FNetWorkObjectInfo 라고 하는 구조체에 정리가 되어 있다.
(대표적 필드: 다음 전송 시간을 나타내는NextUpdateTime, bPendingNetUpdate - 포화상태가 되었을 때 패킷을 보내지 못할 때 체크되는 값)
패킷을 보내지 않는 경우
- 초기화 안되어있음
- 타이밍이 안됌
- 휴면 상태
보내는 경우
- ConsiderList 에 모아둔 액터들
ConsiderList 에 들어간 액터들은 각각 자신의 prereplication 함수를 호출해 준비가 되었다고 알려준다.
이를 기반으로 해서 클라이언트마다 액터 목록을 만들어준다.
클라이언트 뷰어 위치에 따라 필요한 액터가 다를 수 있기 때문에 클라이언트 뷰어 정보를 참고해서 ConsiderList로부터 별도의 액터 묶음을 만들어 줌 (PriorityList)
그 다음 우선권을 계산해서 PriorityList의 액터들을 정렬함.
정렬을 위해 FActorPriority라는 구조체 사용(우선권 값 필드, FNetWorkObjectInfo)
정렬된 우선권 리스트에 따라 액터의 정보를 하나씩 클라이언트에 보내다 네트워크가 포화되면 bPendingNetUpdate 플래그를 활성화 해 다음 서버 틱에서 참고하도록 조정
다른 클라이언트는 해당 클라이언트의 뷰어에 따라 연관성과 우선권이 달라지기 때문에 클라이언트에 맞는 새로운 우선권 리스트가 만들어지고 정보가 다르게 전송된다.
ServerReplicateActors
액터 리플리케이션 대부분은 UNetDriver::ServerReplicateActors 안에서 일어납니다.
서버가 각 클라이언트에 연관성이 있다고 결정내린 액터 전부를 수집하고, 접속된 각 클라이언트가 지난 번 업데이트된 이후 변경된 프로퍼티가 있으면 전송하는 곳입니다.
ConsiderList 생성 후
ServerReplicateActors_BuildConsiderList() 함수에서 prereplication 이 호출된다.
더 자세한 내용은 아래 자세한 '자세한 액터 리플리케이션 흐름' 에 작성되어 있다.
참고 문서
조건식 프로퍼티 리플리케이션
조건에 따라 액터 프로퍼티를 리플리케이트하는 법에 대한 상세 정보입니다.
docs.unrealengine.com
https://docs.unrealengine.com/4.27/ko/InteractiveExperiences/Networking/Actors/ReplicationFlow/
자세한 액터 리플리케이션 흐름
로우 레벨 액터 리플리케이션에 대한 상세 설명입니다.
docs.unrealengine.com
'언리얼엔진5 > [Part3] 이득우의 언리얼 프로그래밍' 카테고리의 다른 글
[이득우의 언리얼 프로그래밍 Part3 필기] 9. 캐릭터 공격 구현 (0) | 2024.05.09 |
---|---|
[이득우의 언리얼 프로그래밍 Part3 필기] 8. RPC 기초 (0) | 2024.05.07 |
[이득우의 언리얼 프로그래밍 Part3 필기] 6. 액터 리플리케이션 빈도와 연관성 (0) | 2024.04.30 |
[이득우의 언리얼 프로그래밍 Part3 필기] 5. 액터 리플리케이션 기초 (0) | 2024.04.29 |
[이득우의 언리얼 프로그래밍 Part3 필기] 4. 액터의 역할과 커넥션 핸드셰이킹 (0) | 2024.04.27 |