2011-11-30 2 views
12

저는 발사체와 떨어지는 블록으로 모바일 (3G 대역폭)에서 교차 크로스 플레이트 게임으로 차례를 고려하여 이것을 수행하는 가장 좋은 방법을 찾으려고합니다.멀티 플레이어 게임에서 물리를 동기화하는 방법은 무엇입니까?

한 장치 (현재 플레이어 회전 = 서버 역할)가 물리를 실행하고 다른 장치에 "키 프레임"데이터 (위치, 블록 방향)를 보낼 수 있는지 궁금합니다. "키 프레임"이 수신되었습니다. 이 방법을 사용하면 다른 플레이어의 장치에서 동일한 시각적 정보를 보장하기 위해 엄청난 양의 데이터가 필요합니다.

또 다른 방법은 물리 데이터 (강제, 가속 ...)를 보내고 다른 장치에서도 물리학을 실행하는 것입니다. 그러나 나는 결코 같은 결과를 가지지 않을 것을 두려워합니다.

+0

개체의 시작 위치가 같고 phyisics 데이터가 동일한 경우 두 개체에서 개체의 결과가 동일하지 않습니까? – Kjetil

+0

@Kjetil 고정 된 틱 시간이있는 경우에만. 각 그래픽 프레임에서 물리를 업데이트하면 일반적으로 적용되지 않습니다. –

+0

오른쪽 롭. 확실하지는 않지만 크로스 플랫폼 (다른 아키텍처)과 부동 소수점 계산을 고려해야 할 문제는 무엇입니까? –

답변

9

나의 현재 구현은 다음과 같이 작동

  1. 서버는 개체의 모든 주요 충돌에 물리 시뮬레이션
  2. 을 관리, 객체의 절대 위치, 회전 및 속도/가속/힘은 각 클라이언트로 전송됩니다 .
  3. 클라이언트는 각 개체를 속도와 함께 위치에 설정하고 필요한 힘을 적용합니다.
  4. 클라이언트는 대기 시간을 계산하고 물리 시스템이 그만큼 지연 시간을 수용하도록 진행합니다.

이것은 나를 위해 아주 잘 작동합니다. 물리 시스템은 수십 개의 하위 시스템 (지도)에서 실행됩니다. 내 구현에 대한

몇 가지 주요 사항 :

가 완전히 "필요한"것으로 표시되지 않은 개체를 무시합니다. 예를 들어, 플레이어의 움직임에 반응하는 먼지와 먼지 입자, 플레이어의 움직임에 반응하는 잔디와 물. 기본적으로 중요하지 않은 것들.

이 모든 것은 UDP를 통해 전송됩니다. 이것은 TCP에서 끔찍한 일입니다.

6

절대 위치와 회전을 보내려합니다.

당신이 맞습니다. 만약 당신이 힘을 보내면 그것은 작동하지 않을 것입니다. 이 작업을 수행 할 수도 있지만 단순히 위치를 전송하는 것보다 훨씬 어렵습니다. 두 장치 모두 같은 방식으로 계산해야하므로 각 프레임 전에 다른 장치의 입력을 기다릴 필요가 있고 동일한 시간 단계를 사용해야하며 스크립트는 같은 순서로 실행되거나 교환 가능해야합니다 , 두 컴퓨터에서 동일한 결과를 내기 위해 보장 된 CPU 명령어 만 사용할 수 있습니다.

마지막으로 부동 소수점 숫자 (부동 소수점/단일 또는 이중)를 사용할 수 없으므로 특히 문제가되는 명령입니다. 정수를 사용하거나 고유 한 숫자 형식을 사용해야하므로 많은 기존 도구를 사용할 수 없습니다.

많은 게임에서는 클라이언트 측 예측 기능이있는 클라이언트 - 서버 모델을 사용합니다. 게임이 턴 기반이라면 클라이언트 측 예측을 사용하지 않고 도망 갈 수 있습니다. 대신 클라이언트의 시간이 약간 지연 될 수 있으므로 렌더링 할 때 서버 입력이 이미있을 것입니다. 클라이언트 측 예측은 클라이언트가 서버가 관심을 갖는 (예 : 이동) 것을 변경할 수있는 경우에만 중요합니다.

+0

각 프레임에 대한 입력을 기다리면서 모든 물리 프레임을 의미합니까? – RobotRock

+0

모든 입력 프레임은 물리적 인 프레임과 1 대 1이 될 수도 있고 그렇지 않을 수도 있습니다. 입력 프레임과 물리 프레임을 일대일로 유지하는 것이 가장 쉽지만 원하는 경우 입력을 샘플링 할 때마다 물리를 두 번 업데이트 할 수 있습니다. – notallama