by
Sophia Lee / 2016. 04. 29. [07:58]
게임을 개발하다 보면, "두 기기 간의 시간 동기화를 하는 방법"이 필요할 때가 있습니다.
이것에 대해서 알아 봅시다.
두 기기의 시간을 동기화하는 것은 일반적으로 round trip latency (RTT)를 이용하는 방법입니다.
기기 A,B가 있다고 있다고 칩시다.
* A->B: A의 시스템 시간을 보낸다.[1]
* B->A: [1]을 그대로 보낸다.
A에서는 A의 시스템 시간에서 [1] 안의 시간을 빼면 RTT를 얻게 됩니다.
이제,
* A->B: RTT[2]와 A의 현재 시간[3]을 보낸다.
이렇게 하면 됩니다. B에서 A의 현재 시간을 얻고 싶으면,
* A의 현재 시간 = [3] + [2]/2
를 계산하면 됩니다.
NTP도 이와 비슷한 방식으로 작동합니다.
컴퓨터 네트워크의 특징상 RTT는 한번만 측정한다고 정확하다고 말할 수 없습니다. 매번 RTT는 조금씩 틀리기 때문입니다. 무선 네트워크에서는 크게 틀리는 경우도 있습니다.
따라서 여러번 잰 후 최근 것의 평균을 내는 것이 더 정확합니다.
참고로, 프라우드넷(proudnet.com)에서 다양한 시간 동기화 함수를 제공합니다.
* CNetClient.GetIndirectServerTimeMs
* CNetClient.GetP2PServerTimeMs
* CNetClient.GetServerTimeMs
프라우드넷은 서버 뿐만 아니라 P2P 연결된 다른 클라이언트와의 RTT를 얻는 기능도 제공합니다.
CNetClient와 CNetServer의 GetLastPing와 GetRecentPing 함수를 이용해서 말이죠.
fc34fd55-7dbc-4990-946c-7ad8fdccd15e|1|1.0|a2ada2ea-6fe9-4468-a833-96aca7417fdf
4. 개발 이야기