저는 테이블 하키 인 빠른 속도의 물리 게임을하고 있습니다. 두 개의 망치와 하나의 퍽으로. 게임은 iphone / ipad에서 실행되며 GameCenter를 통해 멀티 플레이어 부분을 수행하고 있습니다.
이것이 네트워크 시스템의 작동 방식입니다. 클라이언트는 매치를 시작하고 서버로 설정되며 매치 요청을 수락하는 클라이언트는 클라이언트입니다.
'서버'에는 물리가 실행 중이며 응답이 즉시 이루어지며 클라이언트도 물리가 실행 중이므로 메시지 교환이 원활하게 이루어집니다. 내가 서버로하는 일은 클라이언트에게 내 퍽 속도와 내 위치를 보내고 클라이언트가 서버와 관련된 퍽 속도 / 위치를 조정하여 동기화되도록한다는 것입니다. 그렇지 않으면 물리가 비 동기화되어 나사를 조입니다.
네트워크 대기 시간이 좋으면 100ms 이하의 결과가 꽤 좋습니다. 클라이언트 측에서 부드러운 게임을 할 수 있으며 이상한 행동이 최소화됩니다. 지연이 약 150 ~ 200ms 인 경우 문제가 발생합니다. 이 경우 클라이언트 퍽이 이미 가장자리와 반대 방향을 쳤지 만 서버에서 지연 메시지를 수신하고 약간 뒤로 물러서 공 동작에 이상한 느낌을줍니다.
나는 그것에 대해 몇 가지를 읽었습니다.
어떻게 해결할 수 있습니까? 내가 가지고있는 가장 좋은 옵션을 읽은 한 타임 스탬프와 함께 서버 / 클라이언트에서 시계 동기화를 수행하여 시계와 관련된 지연 메시지를 얻을 때 무시하고 클라이언트 시뮬레이션을 수행하도록합니다. 일. 당신은 그것에 동의합니까? 그리고 IM을 신뢰할 수없는 데이터 (UDP)로 보내면 지연 된 메시지 또는 메시지가 잘못 나타날 수 있습니다.
이것이 최선의 방법이라면 시계 동기화를 어떻게 구현합니까? 방법에 대한 단계를 읽었지만 이해하지 못했습니다.
그것은 말합니다 :
- 클라이언트는 "시간 요청"패킷에 현재 현지 시간을 표시하고 서버로 보냅니다.
- 서버가 서버를 수신하면 서버는 서버 시간을 표시하고 반환
- 클라이언트가 수신하면 클라이언트는 전송 된 시간에서 현재 시간을 빼고 두 시간으로 나누어 대기 시간을 계산합니다. 서버 시간에서 현재 시간을 빼서 클라이언트-서버 시간 델타를 결정하고 올바른 클럭 델타를 얻기 위해 반 대기 시간을 추가합니다. (지금까지이 algothim은 SNTP와 매우 유사합니다)
- 클라이언트는 1 ~ 3 단계를 5 번 이상 반복하여 매번 몇 초씩 일시 중지합니다. 다른 트래픽은 중간에 허용 될 수 있지만 최상의 결과를 얻으려면 최소화해야합니다. 패킷 수신 결과는 가장 낮은 지연 시간에서 가장 높은 지연 시간 순서로 누적되어 정렬됩니다. 중간 지연 시간은이 정렬 된 목록에서 중간 점 샘플을 선택하여 결정됩니다.
- 중앙값으로부터 대략 1 표준 편차를 초과하는 모든 샘플은 버리고 나머지 샘플은 산술 평균을 사용하여 평균화됩니다.
이 예제를 따르면 다음과 같이됩니다.
게임이로드되었다고 가정하고 클라이언트 시간은 지금 0이므로 서버에 내 시간이 0임을 보냅니다.
메시지는 서버에 도달하는 데 150ms가 걸리지 만 서버의 시계는 이미 시작되었으며 클라이언트보다 1 초 앞서 있습니다. 서버가 메시지를 받으면 시간은 1.15가되고 그 시간을 클라이언트에게 보냅니다. 지연이 150ms로 일정하다고 가정하자.
이제 클라이언트는 시간 1.15를 수신하고 전송 된 시간에서 현재 시간을 빼고 대기 시간을 계산하기 위해 2로 나눕니다. Wich는 0.3-0 = 0.3 / 2-> 150ms입니다.
클라이언트 시간 : 델타 시간을 결정하기 위해 서버 시간에서 현재 시간을 빼고 올바른 클럭 델타를 얻기 위해 반 지연 시간을 추가합니다.
클라이언트 시간 : 0.3 서버 시간 1.15
0.3-1.15 = .85 + 대기 시간 (.15) = 1
어떻게 동기화 되나요? 내가 무엇을 놓치고 있습니까?
멀티 플레이어와 네트워크 경험이 처음이므로 혼란 스럽습니다.
감사합니다.