2D 하향식 사수를 작업 중이며 Quake 3과 같은 네트워크 게임에 사용 된 개념을 복사하기 위해 최선을 다하고 있습니다.
- 권위있는 서버가 있습니다.
- 서버는 클라이언트에게 스냅 샷을 보냅니다.
- 스냅 샷에는 타임 스탬프 및 엔터티 위치가 포함됩니다.
- 스냅 샷 위치간에 엔티티가 보간되므로 움직임이 부드럽게 보입니다.
- 필연적으로 엔티티 보간은 "과거에"약간 발생하여 보간 할 스냅 샷이 여러 개 있습니다.
내가 직면 한 문제는 "시계 동기화"입니다.
- 간단하게하기 위해 패킷을 서버로 전송하거나 서버에서 전송할 때 대기 시간이없는 것으로 가정 해 봅시다.
- 서버 클럭이 클라이언트 클럭보다 60 초 앞선 경우 스냅 샷 타임 스탬프는 클라이언트 로컬 타임 스탬프보다 60000ms 앞선 것입니다.
- 따라서, 클라이언트 스냅 샷은 클라이언트 시계가 따라 오는 데 시간이 오래 걸리기 때문에 클라이언트가 주어진 엔티티가 자신의 움직임을 확인하기 전에 약 60 초 동안 수집 및 앉아 있습니다.
스냅 샷을받을 때마다 서버와 클라이언트 시계의 차이를 계산하여이 문제를 해결했습니다.
// For simplicity, don't worry about latency for now...
client_server_clock_delta = snapshot.server_timestamp - client_timestamp;
엔티티가 보간에 얼마나 멀리 있는지 결정할 때 클라이언트의 현재 시간에 차이를 추가하기 만하면됩니다. 그러나 이것의 문제점은 스냅 샷이 다른 것보다 빠르거나 느리게 도착하기 때문에 두 시계 사이의 차이가 갑자기 변동하기 때문에 위험을 초래한다는 것입니다.
인지 할 수있는 유일한 지연이 보간을 위해 하드 코딩 된 지연과 일반적인 네트워크 대기 시간으로 인해 발생하는 지연만큼 충분히 클록을 동기화하려면 어떻게해야합니까?
다시 말해, 시계가 크게 동기화되지 않은 상태에서 보케가 발생하지 않고 보간이 너무 늦거나 너무 빨리 시작되지 않도록하려면 어떻게해야합니까?
편집 : Wikipedia 에 따르면 NTP를 사용하면 인터넷을 통해 몇 밀리 초 이내에 시계를 동기화 할 수 있습니다. 그러나 프로토콜이 복잡해 보이며 게임에서 사용하기에는 너무 과도할까요?