Game Center多人对接会问题

Game Center multiplayer matchmaking issue

我正在尝试使用 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 代码(文件应该有 .m 扩展名而不是 .mm).在 Objective-C++(扩展名为 .mm 的文件)中编写包装器 class 来调用这些 Game Center 方法。

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

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

这两个都有一定的限制 connections/requests 免费(我猜 Firebase 的免费连接数比 AWS 多。您可能需要检查一下)。因此,在您的游戏真正开始赚钱之前,您不会在很长一段时间内承担任何费用。在我的 AWS Lambda + DynamoDB 组合上,我每天可以在不花一分钱的情况下进行 11k 的配对。

最重要的是,这两者都提供区域中心。所以当你扩大规模时,你可以创建多区域中心。

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