2

だから、私は非常に単純なリアルタイム ゲーム センター 2 プレーヤー ゲームを書いています。ただし、問題は、切断され続けることです。

ゲームは次のように機能します。各プレイヤーは、自分のデバイスにテキスト フィールドを持っています。それぞれがフィールドにテキストを入力し、Enter キーを押します。両方の人がテキストを入力すると、ゲームが進行します。

現在、ユーザーがアクティブにゲームをプレイしている場合 (約 10 秒ごとにテキストを入力している場合)、ゲームは問題なく動作し、ユーザーが切断されることはありません。ただし、ゲームが約 30 秒以上非アクティブな状態 (ユーザーが座ってアプリ画面をじっと見つめている) になると、少なくとも 1 人のプレイヤーが切断されます。

私のインターネットは安定しており、両方のデバイスが (wifi 経由で) インターネットに接続されているように見えます。

これは非常に漠然とした質問であることは承知しています。上記の太字の症状に関連するアイデアを誰かが持っているかどうか疑問に思っていました.

編集:

matchrequest と match を初期化する方法は次のとおりです。ただし、試合の初期化や開始に問題はありません。唯一の問題は、プレイヤーが一定時間アイドル状態になったときです

//toInvite may be nil
- (void) createMatchWithPlayersToInvite: (NSArray *) toInvite
{
    GKMatchRequest *request = [[GKMatchRequest alloc] init];
    request.minPlayers = 2;
    request.maxPlayers = 2;
    request.playersToInvite = toInvite;
    GKMatchmakerViewController *mmvc = [[GKMatchmakerViewController alloc] initWithMatchRequest:request];
    self.myMatchmakerVC = mmvc;
    mmvc.hosted = NO;
    mmvc.matchmakerDelegate = self;
    [self presentViewController:mmvc animated:YES completion:nil];
}


- (void)matchmakerViewController:(GKMatchmakerViewController *)viewController didFindMatch:(GKMatch *)match
{
    [self dismissViewControllerAnimated:YES completion:nil];
    self.myMatch = match;
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    appDelegate.currentMatch = self.myMatch;
    if (!self.matchStarted && match.expectedPlayerCount == 0)
    {
        self.matchStarted = YES;
        [self performSegueWithIdentifier:@"gameSegue" sender:self];
    }
}

編集2:

そのため、タイマーを設定してネットワーク経由でメッセージを送信すると ([self.myMatch sendDataToAllPlayers:data withDataMode:GKMatchSendDataReliable error:&error] を使用して) 1 秒ごとにプログラムが正常に動作することがわかりました。これがなぜなのか、または一緒にハッキングに頼らずに問題を解決する方法を知っている人はいNSTimerますか? その他の注意事項:

1) 私AppDelegateは変更されていません

4

1 に答える 1

2

ここには明確な仮説があるようです。つまり、Game Center 接続は 30 秒のアイドル時間後に閉じられるということです。これが事実であっても、私は驚かないでしょう。他のゲームはほぼ確実にこのような間隔でデータを送信し、タイムアウト状態を引き起こしている可能性があります。この仮説を検証し、同時に問題を修正するために、5 秒または 10 秒ごとに短いブラインド テキストを送信します。

于 2013-01-23T19:09:45.453 に答える