Мы пытаемся установить многопользовательское соединение между двумя устройствами, используя платформу MPC в игре libgdx.
Что в целом мы сделали успешно:
- Устройства подключаются, сеанс устанавливается правильно.
- После того, как сеанс установлен, nearBrowser и nearAdvertiser перестают делать свои дела.
- Затем делаем переход к игровой сцене. В новой сцене одно устройство может отправлять сообщение другому.
- Вызывается метод DidReceiveData из Session Delegate, и мы получаем правильные сообщения для обоих устройств.
- После этого мы отправляем в 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);
}
});
}
Вот вопросы: где ошибка? И как это исправить?
1 ответ
Проблема была в плагине robovm. В режиме отладки он сделал сборку разрушенной. После создания релизной сборки ошибка исчезла. После работы с robovm + libgdx я понял, что если у вас странная ошибка, просто сделайте релизную сборку. Похоже, что подобные ошибки были устранены в последней версии robovm 1.3 (я еще не пробовал).
Похожие вопросы
Новые вопросы
ios
iOS - мобильная операционная система, работающая на Apple iPhone, iPod touch и iPad. Используйте этот тег [ios] для вопросов, связанных с программированием на платформе iOS. Используйте связанные теги [target-c] и [swift] для проблем, характерных для этих языков программирования.