2012-06-12 3 views
1

GameKit으로 멀티 플레이어 게임을 만들고 있습니다. 내 문제는 두 개의 장치가 연결되면 게임이 약간의 시간 차이로 실행되기 시작한다는 것입니다. 장치가 켜지면 조금 후에 게임이 시작됩니다. 그러나 이것은 내가 원하는 것이 아닙니다. 두 기기에서 동시에 시작하고 싶습니다. 그래서 내가 제일 먼저 내가이 같은 두 장치에 시작의 시간을 확인할 수 있습니다 :멀티 플레이어 게임의 시작 시간 균형을 유지하는 방법은 무엇입니까?

startTime = [NSDate timeIntervalSinceReferenceDate]; 

를이는 모습입니다 :

361194394.193559 

가 그럼 난 다른 장치에 startTime 값을 전송 수신 된 값을 다른 장치의 startTime과 비교합니다.

- (void)balanceTime:(double)partnerTime 
{ 
    double time_diff = startTime - partnerTime; 

    if (time_diff < 0) 
     startTimeOut = -time_diff; 
} 

그래서 두 시작 시간 사이의 차이가 음수 인 경우에는이 기기는 앞서 개시되는 것을 의미하고, 따라서 그것은 doublestartTimeOut 변수에 할당 정확하게 차이 기다려야 통상 2.602417 같은 것이다. 그럼 내 업데이트 방법으로 내 게임을 일시 중지합니다.

- (void)update:(ccTime)dt 
{ 
    if (startTimeOut > 0) 
    { 
     NSLog(@"START TIME OUT %f", startTimeOut); 
     startTimeOut -= dt; 
     return; 
    } 
} 

하지만 불행히도 도움이되지 않습니다. 또한 장치 시작 시간의 차이를 연장 할 수 있습니다. 나는 이유를 알 수 없다. 내가하는 모든 일이 합리적이라고 생각해. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 어떻게 수정합니까? 너는 무엇을 할 것이냐? 고마워요

+1

두 장치의 시간은 완전히 다를 수 있으므로이 솔루션은 효과가 없습니다. –

+0

하지만 왜? 나는 [NSDate timeIntervalSinceReferenceDate]를 참조한다; 두 장치 모두 절대적입니다. 따라서 작동해야합니다. –

+0

어떻게 얻었습니까? "수신자와 2001 년 1 월 1 일 GMT의 첫 번째 순간 사이의 간격을 반환합니다." – TheAmateurProgrammer

답변

2

Almo가 언급했듯이, 두 장치를 동시에 동기화 할 수 없습니다. 가장 낮은 단계에서 Heisenberg Uncertainty Principle에 치아를 g아 먹을 것입니다. 20 분의 1 초 내에 동기화 할 두 개의 장치를 얻는 것조차 쉬운 작업이 아닙니다. 또한 각 장치의 시계가 너무 비동기 적으로 실행되기 때문에 시간 동기화가 다소 자주 발생해야합니다 (즉, 조금 더 빠르거나 느린 비트).

Wifi, Blutooth 또는 무선으로 데이터를 전송함으로써 발생하는 지연을 고려해야합니다. 이 지연은 일정하지 않으며 한 프레임에서 10ms, 다른 프레임에서 1000ms가 될 수 있습니다. 지연을 취소 할 수도없고 예측할 수도 없습니다. 하지만 플레이어의 움직임을 예측할 수 있습니다.

게임용 솔루션 또는 그 중 하나 이상은 클라이언트 측 예측 및 추측 계산입니다. This SO question has a few links of interest.

관련 문제