UE5/Network

[UE5] 서버-클라이언트 왕복 시간 동기화

samoyedAlice 2024. 4. 1. 00:44

Server : GetWorld()->GetTimeSeconds();

Client : GetWorld()->GetTimeSeconds();

<-> 실행시 UI에 표시되는 시간이 3초의 차이가 있다면, Loading Time 이라한다, 보통 로딩되는 시간이 클라이언트 마다 다르기 때문이다


이 차이를 계산해주는 함수가 필요하다
-> 이걸 GetServerTime()이라고 하자

우선, Client가 RPC를 통해 서버에 시간을 묻고, 서버는 다시 RPC로 자신의 시간을 알려준다
이걸로 계산하면되는데, 한가지 변수가 있다. 바로 네트워크 핑에 의해 RPC의 소요시간을 알아내야한다

Client->Server의 RPC 소요시간과 Server->Client의 RPC 소요시간을 합한 시간을 Round Trip Time이라 한다
-> 서버 - 클라이언트간 네트워크 왕복 시간

그럼 1/2 RTT가 Single Trip time(편도 시간)이 된다
-> 이건 정확히 편도시간과 일치하진 않지만, 1/2로 계산해서 쓸만큼은 정확하다
(극단적으로 RTT가 70ms일경우 출발 40ms, 도착 30ms일 수 있다는 뜻)

RPC를 Client에서 Server로, 다시 Server에서 Client로 보낸 뒤,
최초로 보낸 시각을 응답받았을 때의 Client시간에서 빼면 RTT가 나오게 된다

CurrentServerTime = ServerTimeofReceipt + 1/2*RTT
Client-ServerDelta = CurrentServerTime - CurrentClientTime
GetServerTime() = CurrentClientTime - Client-ServerDelta

PlayerController에서, 게임이 시작되고 가장 빠르게 Sync를 계산할 수 있는 함수는
ReceivedPlayer()이다 이걸 override해서 ClientServerDelta의 초기값을 설정해두자
그리고 Tick()내에서 DeltaTime을 누적해서 5초마다 Update 해주면 된다

이렇게하면 서버와 클라이언트 마다 로딩시간이 제각각이라 최초로 실행된 뒤 싱크를 맞추려해도
처음 5초간은 로딩시간의 차이가 난다
하지만 5초 뒤에 전부 싱크가 맞춰져 네트워크 지연을 고려한 동일한 서버시간을 모든 클라이언트가 보게된다