Google Play 游戏服务 (GPGS) 实时多人游戏 (RTMP) 在 Android 上永远无法匹配(iOS 工作)
Posted
技术标签:
【中文标题】Google Play 游戏服务 (GPGS) 实时多人游戏 (RTMP) 在 Android 上永远无法匹配(iOS 工作)【英文标题】:Google Play Games Service (GPGS) Realtime Multiplayer (RTMP) never matches on Android (iOS works) 【发布时间】:2015-04-20 11:55:10 【问题描述】:我们正在尝试实现 GPGS RTMP C++ 并遇到了一个奇怪的问题。我们遵循 ButtonClicker 中使用的默认示例,实际上它在 ios 设备之间运行良好。但是,当我们使用两个 android 设备尝试相同的代码时,快速匹配永远不会完全完成。
使用 Android 版本,我们可以创建一个房间,但一旦开始进行快速游戏匹配,两台设备都会收到一个房间状态更改回调,状态为 CONNECTING。他们仍然保持这种状态,并且我们在任何回调中都没有收到任何其他通知。同样的代码在 iOS 上运行时同样有效,我们假设开发者控制台中的所有内容都已正确设置,因为我们可以访问 Google play 并且能够在两种设备上成功创建房间。
此外,如果我尝试将 Android 连接到 iOS 设备,我会在 Android 端得到相同的行为,但 iOS 设备会在 OnConnectedSetChanged 回调中快速显示 Android 播放器的状态更改为断开连接。
我还重建/重新导入了 android SDK 项目(确保我们有最新的 SDK),确保我们使用的是 1.3 的 c++ 项目。也使用 NDK 9d 和 Cocos2d-x v2.2.6
以防万一以下是对已得到答案的人的线索/红色警报。我们在 GPGS 上遇到的另一个奇怪问题是成就(总体或进度)他们不会发布/保留进度(没有错误),但排行榜确实保留和进步......也许这是相关的。
我们还尝试通过 alpha 和 beta 发行版通过 google play 构建(签名和 zip 对齐)
编辑:添加更多信息 这是我们从 Android 到 Android 匹配的日志:
02-19 18:24:44.252: D/cocos2d-x debug info(27707): jni:isConnected is defined.
02-19 18:24:44.262: D/DA2(27707): isConnected() called.
02-19 18:24:44.272: D/cocos2d-x debug info(27707): isConnected(true) JNI Done.
02-19 18:24:44.272: I/DA2_GPGStateManager(27707): Entering GPGSStateManager::IsAuthorized()
02-19 18:24:44.272: D/cocos2d-x debug info(27707): Checking if user is GPGS authorized: YES
02-19 18:24:46.492: D/cocos2d-x debug info(27707): created a room 1
02-19 18:24:46.492: D/cocos2d-x debug info(27707): MY PLAYER ID IS: p_CP2QiKTYldGO5wEQAQ : Player Y
02-19 18:24:46.812: D/cocos2d-x debug info(27707): OnRoomStatusChanged
02-19 18:24:46.812: D/cocos2d-x debug info(27707): GPG Room status changed to CONNECTING.
02-19 18:24:49.542: D/dalvikvm(27707): threadid=34: thread exiting, not yet detached (count=0)
02-19 18:24:49.542: V/GamesNativeSDK(27707): Detaching from JVM on thread main_dispatch
编辑:添加更多信息 从 iOS 日志的角度来看,这是我们从 Android 到 iOS 匹配的日志:
Cocos2d: OnRoomStatusChanged
Cocos2d: GPG Room status changed to CONNECTING.
2015-02-19 01:41:08.790 dam[20540:2466970] INFO: OP: 1
2015-02-19 01:41:08.791 dam[20540:2466970] INFO: CALL_STATE_CHANGED_OP: New state: 1
2015-02-19 01:41:08.792 dam[20540:2466970] ERROR: peer_capabilities must not be null in PeerStateMachine::WaitingForConnectionData
2015-02-19 01:41:08.793 dam[20540:2466970] INFO: PeerStateMachine: WaitingForOutgoingRemoteConnectionNoSessionId-1j89l5beklypm389fttwl6uuy0@public.talk.google.com/games_andrB648F1B2 transitionTo WaitingForConnectionData-1j89l5beklypm389fttwl6uuy0@public.talk.google.com/games_andrB648F1B2
2015-02-19 01:41:09.070 dam[20540:2466970] INFO: OP: 6
2015-02-19 01:41:09.071 dam[20540:2466970] INFO: CALL_STATE_CHANGED_OP: New state: 6
2015-02-19 01:41:09.072 dam[20540:2466970] INFO: PeerStateMachine: Not handled -- invoking default handler for:7002
2015-02-19 01:41:09.072 dam[20540:2466970] ERROR: - unhandledMessage: message.type=7002
2015-02-19 01:41:09.073 dam[20540:2466970] INFO: OP: 14
2015-02-19 01:41:09.074 dam[20540:2466970] INFO: CALL_STATE_CHANGED_OP: New state: 14
2015-02-19 01:41:09.075 dam[20540:2466970] INFO: PeerStateMachine: Not handled -- invoking default handler for:7002
2015-02-19 01:41:09.077 dam[20540:2466970] ERROR: - unhandledMessage: message.type=7002
2015-02-19 01:41:09.194 dam[20540:2466969] INFO: Connection status: CONNECTION_ESTABLISHED reporting ? 0
2015-02-19 01:41:09.195 dam[20540:2466970] INFO: PeerStateMachine: WaitingForConnectionData-1j89l5beklypm389fttwl6uuy0@public.talk.google.com/games_andrB648F1B2 transitionTo ConnectedState-1j89l5beklypm389fttwl6uuy0@public.talk.google.com/games_andrB648F1B2
Cocos2d: OnRoomStatusChanged
Cocos2d: GPG Room status changed to ACTIVE.
Cocos2d: PLAYER: Player X STATUS:2 IN ROOM: Y
Cocos2d: PLAYER: Player 6459 STATUS:2 IN ROOM: Y ID:p_CIuY5fK73c-kKRAB
2015-02-19 01:41:18.936 dam[20540:2466970] INFO: OP: 13
2015-02-19 01:41:18.937 dam[20540:2466970] INFO: CALL_STATE_CHANGED_OP: New state: 13
2015-02-19 01:41:18.938 dam[20540:2466969] INFO: Attempting to reconnect to: p_CIuY5fK73c-kKRAB
2015-02-19 01:41:18.938 dam[20540:2466970] INFO: PeerStateMachine: ConnectedState-1j89l5beklypm389fttwl6uuy0@public.talk.google.com/games_andrB648F1B2 transitionTo EntryState-1j89l5beklypm389fttwl6uuy0@public.talk.google.com/games_andrB648F1B2
2015-02-19 01:41:18.940 dam[20540:2466969] INFO: Attempting to reconnect to: p_CIuY5fK73c-kKRAB
2015-02-19 01:41:18.941 dam[20540:2466969] INFO: Waiting for connection from p_CIuY5fK73c-kKRAB
2015-02-19 01:41:18.943 dam[20540:2466970] INFO: PeerStateMachine: Setting peer 1j89l5beklypm389fttwl6uuy0@public.talk.google.com/games_andrB648F1B2 capabilities to 0
2015-02-19 01:41:18.944 dam[20540:2466970] ERROR: peer_capabilities must not be null in PeerStateMachine::WaitingForOutgoingRemoteConnectionNoSessionId
2015-02-19 01:41:18.945 dam[20540:2466970] INFO: PeerStateMachine: EntryState-1j89l5beklypm389fttwl6uuy0@public.talk.google.com/games_andrB648F1B2 transitionTo WaitingForOutgoingRemoteConnectionNoSessionId-1j89l5beklypm389fttwl6uuy0@public.talk.google.com/games_andrB648F1B2
2015-02-19 01:41:18.946 dam[20540:2466970] ERROR: No session mapped for 1211971051
2015-02-19 01:41:18.947 dam[20540:2466970] ERROR: - unhandledMessage: message.type=7008
2015-02-19 01:41:18.948 dam[20540:2466970] INFO: OP: 1
2015-02-19 01:41:18.949 dam[20540:2466970] INFO: CALL_STATE_CHANGED_OP: New state: 1
2015-02-19 01:41:18.951 dam[20540:2466970] ERROR: peer_capabilities must not be null in PeerStateMachine::WaitingForConnectionData
2015-02-19 01:41:18.953 dam[20540:2466970] INFO: PeerStateMachine: WaitingForOutgoingRemoteConnectionNoSessionId-1j89l5beklypm389fttwl6uuy0@public.talk.google.com/games_andrB648F1B2 transitionTo WaitingForConnectionData-1j89l5beklypm389fttwl6uuy0@public.talk.google.com/games_andrB648F1B2
2015-02-19 01:41:19.262 dam[20540:2466970] INFO: PeerStateMachine: Not handled -- invoking default handler for:6010
Cocos2d: OnConnectedSetChanged
Cocos2d: PLAYER: Player X STATUS:2 IN ROOM: N
Cocos2d: PLAYER: Player 6459 STATUS:4 IN ROOM: N
Cocos2d: GPGSRealtimeMultiplayerManager::disconnect() called.
Cocos2d: REMOVE PLAYER: Player X ID:p_CIedtPyuzNqXkwEQAQ
Cocos2d: GPGSRealtimeMultiplayerManager::disconnect() called.
2015-02-19 01:41:19.262 dam[20540:2466970] ERROR: - unhandledMessage: message.type=6010
Cocos2d: REMOVE PLAYER: Player 6459 ID:p_CIuY5fK73c-kKRAB
Cocos2d: GPGSRealtimeMultiplayerManager::disconnect() called.
2015-02-19 01:41:19.268 dam[20540:2466970] INFO: PeerStateMachine: Not handled -- invoking default handler for:6004
2015-02-19 01:41:19.269 dam[20540:2466969] INFO: Disconnecting all peers
2015-02-19 01:41:19.270 dam[20540:2466969] ERROR: Transitioning to LeavingRoomState with invalid player id!
Cocos2d: GPG Multiplayer room left unsuccessfully! (now what?)
Cocos2d: GPG Multiplayer room left unsuccessfully! (now what?)
2015-02-19 01:41:19.337 dam[20540:2466970] INFO: PeerStateMachine: WaitingForConnectionData-1j89l5beklypm389fttwl6uuy0@public.talk.google.com/games_andrB648F1B2 transitionTo EntryState-1j89l5beklypm389fttwl6uuy0@public.talk.google.com/games_andrB648F1B2
2015-02-19 01:41:19.339 dam[20540:2466970] INFO: OP: 12
2015-02-19 01:41:19.340 dam[20540:2466970] INFO: CALL_STATE_CHANGED_OP: New state: 12
2015-02-19 01:41:19.341 dam[20540:2466970] ERROR: No session mapped for 3259690520
2015-02-19 01:41:19.341 dam[20540:2466970] ERROR: - unhandledMessage: message.type=7008
Cocos2d: LOBBY ROW DEALLOC
2015-02-19 01:41:19.556 dam[20540:2467034] VERBOSE: Request had Apiary Status Code: 0
Cocos2d: GPG Multiplayer room left successfully (Quick Game/Invite)
2015-02-19 01:41:19.585 dam[20540:2466970] INFO: PeerStateMachine: Not handled -- invoking default handler for:6010
2015-02-19 01:41:29.271 dam[20540:2466415] ERROR: - unhandledMessage: message.type=48
2015-02-19 01:41:29.587 dam[20540:2466415] ERROR: - unhandledMessage: message.type=48
我会在收集到一些 Android 透视日志后立即发布。我们使用的是 zip 对齐的,并且所有的日志打印都被剥离了。
【问题讨论】:
投反对票很好,但请帮助我们。这个问题缺少什么?这不是一个小问题。需要什么才能使这个问题变得更好? 成就和排行榜都像冠军一样运作。提到的成就问题有一个成就ID,其中有错字并且完全不相关。我们仍然不能在 cocos2d-x 中使用 Google 邀请屏幕。屏幕一显示,连接的播放器就会被丢弃。但我们可以将其用于 1v1 连接。 您应该在 gpg cpp 示例 github 上打开一个问题。感谢您显示此问题。 【参考方案1】:在 Android 上,房间状态更改不像在 iOS 上那样宣布。 特别是回调:
IRealTimeEventListener::OnRoomStatusChanged
解决方案是检查任何回调并检查状态变化。为了完全确定,每当房间参与者发生变化时,我们都会跟踪最后一个已知的房间状态。
在我们的例子中,OnParticipantStatusChanged
是最关键的。
幸运的是,它是一个简单的系统,只有少数带有房间引用的回调存在...... O.o
我们可以通过这种方式在 Android 到 Android 和 Android 到 iOS 之间玩游戏......似乎可以通过这种方式跟踪状态,但也许它会对某人有所帮助! v1.2 和 v1.3 都是这种行为。
当我修改 minimalist 应用程序(在支持的每个版本中运行)以包含来自 Button Clicker 示例应用程序的操作(这需要更高版本的 Android 来为 ui 组件利用 JUI)时,我发现了这一点。我发送数据并注意到它被接收完全是一个意外......我很高兴我注意到了。
【讨论】:
很高兴它有所帮助。我们花了一段时间才弄清楚。无论如何,它是一种解决方法......我们还没有尝试查看是否有新的修复。它在大部分的情况下都有效... 我遇到的问题是 SDKBOX 及其 GPS 实时多人游戏的实现,Android 设备上没有触发一些回调。因此,在阅读完本文后,我测试了 Android - Android 和 Android - iOS 之间的每个回调,发现只有P2PDisconnected()
不起作用。所以现在我将监控所有关于房间更改的回调,特别是OnParticipantStatusChanged
以获取参与者信息。
太棒了,很高兴它有帮助。你用的是什么版本的sdk?以上是关于Google Play 游戏服务 (GPGS) 实时多人游戏 (RTMP) 在 Android 上永远无法匹配(iOS 工作)的主要内容,如果未能解决你的问题,请参考以下文章
使用上传密钥而不是 Google Play 应用签名密钥测试游戏服务
Google Play 游戏服务 UNREGISTERED_ON_API_CONSOLE
如何在使用 Google Play 游戏服务的实时多人游戏中使用机器人玩家?