【问题标题】:Game Center multiplayer matchmaking issue游戏中心多人配对问题
【发布时间】:2018-12-10 05:33:07
【问题描述】:

我正在尝试使用 Game Center 创建一个实时多人游戏。对于配对,我使用以下代码使用编程方法:

[[GKMatchmaker sharedMatchmaker] findMatchForRequest:request withCompletionHandler:^(GKMatch *match, NSError *error) {
        if (error)
        {
            // Process the error.
            NSLog(@" error => %@ ", [error userInfo] );

        }
        else if (match != nil)
        {
            NSLog(@"Match Found _-----------");
            currentMatch = match;
            match.delegate = self;

            NSLog(@"Expected player count:%ld",match.expectedPlayerCount);

            if ( match.expectedPlayerCount == 0)
            {
                NSLog(@"Ready to start match!");

            }
        }
    }];

目前,当找到匹配时,代码会生成以下错误:

ABC-mobile[342:26698] [log]  [ERROR] ReXmitCollectionRequest:640 /BuildRoot/Library/Caches/com.apple.xbs/Sources/AVConference/AVConference-1020.31/ICE.subproj/Sources/ICEMessage.c:640:     ReXmit [SNATMAP_REQUEST] (1:0) from [192.168.0.104:16402] to [17.133.234.32:16384] failed (801A0002)

ABC-mobile[342:26698] [log]  [ERROR] -[GKConnectionInternal internal_setRemoteConnectionData:fromParticipantID:pendingConnectionPIDList:]:1041 GCKSessionPrepareConnection FAILED(80150016)

我正在使用 Cocos2D-X 游戏引擎,并从 C++ 函数调用此方法。

我将不胜感激有关此主题的任何建议和想法。谢谢。

【问题讨论】:

    标签: objective-c cocos2d-x game-center


    【解决方案1】:

    解决方案:

    使用纯 Objective-C 代码(文件应具有 .m 扩展名而不是 .mm)。用 Objective-C++(扩展名为 .mm 的文件)编写一个包装类来调用这些 Game Center 方法。

    【讨论】:

    • 没有必要为此专门使用 Objective-C (.m)。它也可以像 Objective-C++ 一样工作,你只需要确保包装方法是在 C++ 头文件中定义的。你没有提供任何你曾经这样做过的代码,所以谁知道为什么它不适合你。如果这确实是您使用 GK 的唯一目的,您也可以直接致电 objc_msgSend
    【解决方案2】:

    我绝不会建议在您自己的云基础设施上部署您的代码进行匹配。我使用 AWS lambda + dynamodb 组合做到了。 Dynamo db 促进了对表键的原子操作。这些关键可能是您匹配玩家的技能点。 Firebase 云功能 + RealtimeDB(也可以试试 CloudStore。那是 Firebase 的新产品)是开发匹配框架的另一种选择。它不提供键的原子性,但有另一个 PushKey 概念。这也有效。

    这两家都是主要的云供应商,因此您不必担心延迟或停机。我在美国的 Firebase RealtimeDB 和来自印度的中心建立了我的中心,我能够在 500 毫秒内将活动转移到印度的另一位玩家。

    这两者都有一定的免费连接/请求限制(我猜 Firebase 的免费连接数比 AWS 多。您可能需要检查一下)。因此,在您的游戏真正开始赚钱之前,您在很长一段时间内都不会产生任何成本。在我的 AWS Lambda + DynamoDB 组合中,我每天可以进行 11k 次配对,而无需支付一分钱。

    最重要的是,这两个都提供区域中心。因此,当您扩大规模时,您可以创建多区域中心。

    但是这两个供应商可能都不在 C++ 或 Objective-C++ 上工作。我在 Javascript 和 JAVA 上开发了我的模型。也许还支持其他一些语言。你可能想检查一下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多