Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

UnrealEngineer

[ UnrealEngine5 ] 액터 리플리케이션 로우레벨 플로우 본문

언리얼엔진5

[ UnrealEngine5 ] 액터 리플리케이션 로우레벨 플로우

UnrealEngineer 2024. 8. 26. 12:01

네트워크 전송 플로우

 

1. 네트워크로 업데이트할 오브젝트 목록화한다. (FNetworkObjectInfo라는 구조체에 포함 시킨다.)

< 대표적인 필드는 NextUpdateTime : 다음에 전송할 시간을 지정 / bPendingNetUpdate : 전송되어 있는지를 파악 >

NextUpdateTime은 빈도 속성인 NetUpdateFrequency 속성과 관련이 있다.

bPendingNetUpdate 값은 포화상태가 되어서 패킷을 보내지 못할때 체크되는 값으로 '우선권'과 관련있다.

 

2. 이러한 모든 액터들은 각각의 상태에 따라서 보낼 액터와 보내지 않을 액터로 걸러진다.

( 보내지 않을 액터 : 서버틱 기준으로 초기화가 아직 안되었거나 보낼 타이밍이 안됐거나 휴면 상태일 수 있다. )

그러므로 보낼 수 있는 액터들만 모아서 따로 목록을 관리한다. = ConsiderList (서버에서 한번만 실행)

ConsiderList에 들어간 액터들은 각각 자신의 PreReplication()이라는 함수를 호출함으로써 전송할 준비가 되었다고 알려준다.

 

3. ConsiderList가 제작되면 이를 기반으로 서버에 접속한 클라이언트 마다 별도의 목록을 만들어준다.

(클라이언트 뷰어 위치에 따라서 리플리케이션되는 액터가 다르기 때문이다.)

이때 '연관성' 정보가 활용된다.

클라이언트마다 보낼 액터들이 취합되면 우선권을 계산해서 이 액터들을 정렬한다.

그러면 각 클라이언트로 보내야할 액터의 대기열이 만들어진다.

< 우선권을 정렬하기 위해서 내부에서는 FActorPriority라는 별도의 구조체를 활용한다. >

 

4. 이렇게 정렬된 우선권 리스트에 따라 액터의 정보를 하나씩 클라이언트에 보내다가 네트워크 상태가 포화되면

FNetworkObjectInfo에 bPendingNetUpdate를 활성화해서 다음 서버 틱에서 이를 참고하도록 조정한다.

< 서버는 이 모든 과정을 매 틱마다 진행한다. >

 

- 액터 리플리케이션의 우선권

● 먼저 보내야하는 액터를 정하고 우선순위에 따라 전송하도록 설정

● NetPriority 속성으로 결정된다. (수치가 클수록 다른 액터보다 많은 대역폭을 받게 된다.)

 

우선권이 2인 액터는 1인 것보다 정확히 두배 빈도로 업데이트된다.

< 모든 우선권을 높인다고 언리얼 네트워크 퍼포먼스가 향상되지 않는다. >

 

AActor::GetNetPriority()를 통해서 우선권을 확인할 수 있다.

 


 

- 액터의 휴면

 

프로퍼티는 리플리케이션에 등록되면 해제시킬 수 없다.

커넥션이 유지된 상태에서 프로퍼티를 미세조정하는 방법이 존재한다.

= 조건형 리플리케이션

DOREPLIFETIME_CONDITION( AActor, ReplicationMovement, COND_SimulatedOnly );

 

 

게임을 제작 후 언리얼인사이트와 같은 도구를 사용해서 네트워크 전송 데이터를 확인하고 너무 많은 리플리케이션으로 인해 대역폭의 Saturation이 일어나면 위와 같은 조건들로 최적화 할 수 있다. But! 너무 많은 조건을 걸면 사실상 계산으로 인해 네트워크가 원활하지 않을 수 있다... 적당히...(?) 

 


 

- 서버 리플리케이션의 로우레벨 흐름

액터 리플리케이션 대부분은 UNetDriver::ServerReplicateActors안에서 일어난다.

서버가 각 클라이언트에 연관성이 있다고 결정내린 액터 전부를 수집하고, 접속된 각 클라이언트가 지난 번 업데이트된 이후 변경된 프로퍼티가 있으면 전송하는 곳!