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 上开发了我的模型。也许也支持其他一些语言。你可能想检查一下。
我正在尝试使用 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 上开发了我的模型。也许也支持其他一些语言。你可能想检查一下。