2014-06-19 2 views
0

나는 첫 번째 게임 인 멀티 플레이어 네트워크 탁구 게임을 개발 중입니다. 현재 상태는 서버와 클라이언트에서 동일한 구성으로 물리 엔진을 실행했습니다. 자신의 외륜 운동은 예측되고 권위있는 서버에 의해 바로 확인됩니다. 둘 사이에 차이점이 있는지, 보간을 통해 클라이언트 위치를 수정합니다. 서버가 각 클라이언트에 100ms마다 스냅 샷을 브로드 캐스팅하기 때문에 상대방 패들도 과거에 200ms에서 100ms까지 보간됩니다.네트워크 탁구 게임에서 공을 동기화하는 방법은 무엇입니까?

지금까지는 매우 잘 작동했지만 지금은 공을 시뮬레이션하고 절차를 이해하는 데 문제가 있습니다.

필자는 급변하는 멀티 플레이어에 대한 밸브 (및 기타 여러 가지) 기사를 여러 번 읽고 해당 방법을 이해했습니다. 어쩌면 볼을 총알과 비교할 수도 있지만, 장점은 총알이 보이지 않는다는 것입니다. 볼을 표시하고 현재의 패들을 볼 때 과거와 서버의 상대방과 서버가 어딘가에있을 때 볼을 모든 인스턴스에서 동기화하고 어떻게 패들에 부딪쳤는지를 확인할 수 있습니까? 외륜이 빠르더라도? 현재 내 볼의 위치는 서버 업데이트에 의해 간단히 설정되므로, 서버 위치가 지연되어 패들이 멀리있는 경우에도 볼이 다시 튀어 나올 수 있습니다.

지금까지 모든 인스턴스에서 동기화 된 시계가 없었습니다. 각 업데이트와 함께 클라이언트 단계 인덱스를 서버에 보냅니다. 서버가 작업을 수행 한 경우 각 클라이언트의 마지막 단계 인덱스가있는 스냅 샷을 클라이언트에 보냅니다. 이제 반환 된 단계 인덱스에서 저장된 위치를 찾고이를 비교합니다. 공을 동기화하려면 공통 시계가 필요합니까?

편집 :
나는 타임 스탬프 서버에 대한 일반적인 시계와 모든 클라이언트를 동기화 시도했습니다. 그러나 타임 스탬프 대신 자체 스테핑을 사용하는 것이 더 좋습니다 (핑 등으로 계산할 필요가 없으므로 타임 스탬프가 정확하지 않을 수 있습니다). 물리학은 초당 60 회 실행되며 이제는 동기화를 유지하기 위해이 기술을 사용합니다. 그게 좋은 방법 이니?

각 클라이언트가 볼을 계산하면 패들의 위치가 다르기 때문에 튀어 나온 각도가 다를 수 있습니다 (상대방은 과거 200ms입니다). 서버가 볼의 위치, 속도 및 각도를 보낼 때 (각 패들의 위치를 ​​알고 있고 권위가 있기 때문에), 바운싱 후에 각도가 다르기 때문에 볼이 매우 다른 위치에있을 수 있습니다 (클라이언트가 서버 데이터를 받기 때문에 100ms 후). 그러한 큰 차이를 어떻게 보완 할 수 있습니까?

답변

0

첫 번째 게임을 개발하면서 가장 단순하지만 무차별 적 방법을 먼저 시도해야한다고 생각합니다. 그렇다면 첫 번째 흥미 진진한 결과를 경험하게 될 것입니다. 그러면 용기를 얻고 더 나은 방법을 시도해보십시오.

소스 엔진 방식과 마찬가지로 게임 플레이를 한쪽에서 처리하고 모든 개체 상태를 1/30 초마다 다른 개체 상태로 보냅니다. 이것은 짐승 같은 방법이지만 LAN 환경에서 작동합니다.

대기 시간이 1/30 초 이상인 WAN 환경에서 문제가 발생합니다.

나는 그것이 실제로 작동 잘 모르겠지만, 나는 생각 :

  1. 공의 움직임은 플레이어의 히트에 의해 변경되지 않는 것으로 가정합니다.
  2. 볼의 위치 P, 속도 및 플레이어 A를 플레이어가 B에 닿을 때만 보냅니다.
  3. B에서 이미 시간 L이 이미 지나간 것처럼 처리하지만 (L = A와 B * 2 사이의 대기 시간) 그러나 렌더링 된 공은 볼 위치 P에 도달 할 때까지 이전 동작을 유지해야합니다.

영향을받지 않는 값은 시간 값이더라도 위장 할 수 있습니다. :)

+0

이 기사는이 질문 뒤에 나타납니다. http://drewblaisdell.com/writing/game-networking-techniques-explained-with-pong/ – opyate

관련 문제