【问题标题】:Real Time Game Center game disconnects (possibly because of network timeout)实时游戏中心游戏断开连接(可能是因为网络超时)
【发布时间】:2013-01-24 03:47:46
【问题描述】:

所以,我正在编写一个非常简单的实时游戏中心 2 人游戏;但是,问题是我一直断开连接。

游戏的运作方式如下:每个玩家的设备上都有一个文本字段。他们每个人都在字段中输入文本并按回车键。当两个人都输入了文字后,游戏就进行了。

现在,当用户积极玩游戏时(每 10 秒左右输入一次文字),游戏运行良好,用户从未断开连接。但是,当游戏保持非活动状态(用户只是坐着盯着应用屏幕)大约 30 秒或更长时间时,至少有一名玩家会断开连接。

我非常有信心我的互联网很稳定,而且两台设备似乎都已连接到互联网(通过 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:

所以,我发现如果我设置一个计时器并每隔 1 秒通过网络发送消息(使用 [self.myMatch sendDataToAllPlayers:data withDataMode:GKMatchSendDataReliable error:&error]),程序就可以正常工作.有谁知道为什么会这样,或者我如何解决我的问题而无需求助于一起被黑NSTimer 其他说明:

1) 我的AppDelegate 没有被更改

【问题讨论】:

  • 抱歉,您需要提供更多信息才能让别人回答这个问题。作为对您的项目完全陌生的人,我们不知道有太多变数。我将从您与之建立联系的代码开始。
  • 是的,我意识到我的问题很模糊,我只是希望有人能认识到闲置播放器的问题。我在上面开始比赛的地方添加了代码。谢谢
  • 黑客不是你使用NSTimer。事实上,您使用的 API 旨在用于以高速率发送消息的游戏循环,例如球员位置。由罕见的 UI 事件驱动这是非常不寻常的,因此如果您超时,NSTimer 是一个合适的解决方法。这里真正的技巧是使用实时 API 来完成一些可以遵循推送模型的事情。

标签: iphone ios objective-c game-center gamekit


【解决方案1】:

看起来您在这里有一个明确的假设,即 Game Center 连接在 30 秒空闲时间后关闭。如果是这种情况,我不会感到惊讶。其他游戏几乎肯定会在这样的间隔内发送数据,并且您可能会触发超时条件。为了检验这个假设并同时解决问题,我会每隔五到十秒发送一个简短的盲文。

【讨论】:

  • 好的,我已经测试了你的理论并得到了奇怪的结果。因此,如果我每 5 或 10 秒设置一次计时器,它就会失败。但是,如果我每 1 秒设置一次,它就可以正常工作。我已经能够让程序闲置超过 8 分钟,没有任何问题。你知道如何解决这个超时问题而不用破解一个计时器吗?如果没有,计时器解决方案将正常工作。谢谢!
  • 恐怕我没有。我认为每秒多次发送消息是很常见的,也许是意料之中的。没有GKErrorTimeout 可以检查。
  • 在消息之间存在长时间延迟的情况下,发送“ping”或“keep-alive”包通常是个好主意。 GameCenter 使用 UDP,因此可能存在 NAT 和其他网络问题。
猜你喜欢
  • 1970-01-01
  • 2013-09-24
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 2011-06-09
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
相关资源
最近更新 更多