在 libgdx 游戏中使用 MPC 框架接收数据时出现错误
Bug in receiving data using MPC framework in libgdx game
我们正在尝试在 libgdx 游戏中使用 MPC 框架在两个设备之间建立多点连接。
我们通常成功完成的事情:
- 设备正在连接,会话正在正确建立。
- 会话建立后nearBrowser和nearAdvertiser停止
做他们的事。
- 然后我们过渡到游戏场景。新场景一机
可以给别人发消息。
- Session Delegate 的 DidReceiveData 方法被调用
我们为这两种设备提供了正确的消息。
- 在此之后我们向 libgdx 发送更新内容的消息(在主
gdx 线程)。
但一段时间后,当某些设备收到数据时,它会立即崩溃。有时它发生在第 10 次接收,有时发生在第 200 次之后。崩溃仅出现在收到消息的设备上。他们连接多长时间并不重要。在所有方法完成数据处理后出现崩溃。所以我们不知道具体错误发生在哪里。
// MCSession delegate method
public void didReceiveData(MCSession session, NSData data, MCPeerID peerID) {
//there we make userInfoData
//
DispatchQueue.getMainQueue().async(new Runnable() {
@Override
public void run() {
NSNotificationCenter.getDefaultCenter().postNotification(new NSString("didReceiveData"), null, userInfoData);
}
});
}
// Register observer in NSNotificationCenter
// NSNotificationCenter.getDefaultCenter().addObserver(this, Selector.register("updateDataWithNotification:"), new NSString("didReceiveData"), null);
// This method is called when device has received new data
@Method
private void updateDataWithNotification(NSNotification notification){
userInfoDict = notification.getUserInfo();
data = (NSData) userInfoDict.get(new NSString("data"));
strBytes = new String(data.getBytes());
// i'm not sure this Gdx.app.postRunnable is really needed
Gdx.app.postRunnable(new Runnable() {
@Override
public void run() {
SBGlobalMessanger.getInstance().readBluetoothMessage(BluetoothData.RC_MESSAGE, strBytes);
}
});
}
问题是:
错误在哪里?我们该如何解决?
问题出在 robovm 插件中。在调试模式下,它使构建崩溃。制作发布后,构建错误消失了。在使用 robovm + libgdx 后我学到的是,如果你有奇怪的错误,只需制作一个发布版本。似乎这种错误在 robovm 1.3 的最后一个版本中被消除了(我还没有尝试过)。
我们正在尝试在 libgdx 游戏中使用 MPC 框架在两个设备之间建立多点连接。
我们通常成功完成的事情:
- 设备正在连接,会话正在正确建立。
- 会话建立后nearBrowser和nearAdvertiser停止 做他们的事。
- 然后我们过渡到游戏场景。新场景一机 可以给别人发消息。
- Session Delegate 的 DidReceiveData 方法被调用 我们为这两种设备提供了正确的消息。
- 在此之后我们向 libgdx 发送更新内容的消息(在主 gdx 线程)。
但一段时间后,当某些设备收到数据时,它会立即崩溃。有时它发生在第 10 次接收,有时发生在第 200 次之后。崩溃仅出现在收到消息的设备上。他们连接多长时间并不重要。在所有方法完成数据处理后出现崩溃。所以我们不知道具体错误发生在哪里。
// MCSession delegate method
public void didReceiveData(MCSession session, NSData data, MCPeerID peerID) {
//there we make userInfoData
//
DispatchQueue.getMainQueue().async(new Runnable() {
@Override
public void run() {
NSNotificationCenter.getDefaultCenter().postNotification(new NSString("didReceiveData"), null, userInfoData);
}
});
}
// Register observer in NSNotificationCenter
// NSNotificationCenter.getDefaultCenter().addObserver(this, Selector.register("updateDataWithNotification:"), new NSString("didReceiveData"), null);
// This method is called when device has received new data
@Method
private void updateDataWithNotification(NSNotification notification){
userInfoDict = notification.getUserInfo();
data = (NSData) userInfoDict.get(new NSString("data"));
strBytes = new String(data.getBytes());
// i'm not sure this Gdx.app.postRunnable is really needed
Gdx.app.postRunnable(new Runnable() {
@Override
public void run() {
SBGlobalMessanger.getInstance().readBluetoothMessage(BluetoothData.RC_MESSAGE, strBytes);
}
});
}
问题是: 错误在哪里?我们该如何解决?
问题出在 robovm 插件中。在调试模式下,它使构建崩溃。制作发布后,构建错误消失了。在使用 robovm + libgdx 后我学到的是,如果你有奇怪的错误,只需制作一个发布版本。似乎这种错误在 robovm 1.3 的最后一个版本中被消除了(我还没有尝试过)。