1

GameKitでマルチプレイヤーゲームを作っています。私の問題は、2 つのデバイスが接続されているときに、ゲームがわずかな時間差で実行を開始することです。少し遅れて、デバイスの 1 つがゲームの実行を開始します。しかし、これは私が望むものではありません。両方のデバイスで同時に起動したい。だから私が最初にすることは、次のように両方のデバイスで開始時刻を確認することです:

startTime = [NSDate timeIntervalSinceReferenceDate];

そして、これはそれがどのように見えるかです:

361194394.193559

次に、他のデバイスに値を送信startTimeし、受信した値を他のデバイスの startTime と比較します。

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

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

したがって、2 つの開始時間の差が負の場合は、このデバイスがより早く開始されていることを意味するため、startTimeOut変数に割り当てられた差double(通常は のようなもの) を正確に待機する必要があり2.602417ます。それで、更新メソッドでゲームを一時停止します

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

しかし、残念ながらそれは役に立ちません。さらに、デバイスの開始時間の差も拡大します。理由がわかりません。私がしていることはすべて合理的なようです。私は何を間違っていますか?どうすれば修正できますか? あなたならどうしますか?どうもありがとう

4

1 に答える 1

2

Almo がコメントしたように、2 つのデバイスを同時に同期することはできません。最低レベルでは、ハイゼンベルグの不確定性原理に歯を食いしばることになります。2 つのデバイスを 10 分の 1 秒以内に同期させることさえ簡単な作業ではありません。さらに、各デバイスのクロックはわずかに非同期で実行されるため (つまり、わずかに速く、またはわずかに遅く)、時間の同期を多かれ少なかれ頻繁に行う必要があります。

また、Wifi、Blutooth、または無線でデータを送信することによって生じる遅延も考慮する必要があります. この遅延は一定ではなく、あるフレームでは 10 ミリ秒、別のフレームでは 1000 ミリ秒になることがあります。ラグをキャンセルすることも、予測することもできません。しかし、プレイヤーの動きを予測することはできます。

ゲーム、またはその少なくとも 1 つのソリューションは、クライアント側の予測と推測航法です。この SO の質問には、興味深いリンクがいくつかあります。

于 2012-06-13T13:38:59.817 に答える