Я разрабатываю многопользовательскую игру, используя MultipeerConnectivityFramework в Swift. Моя проблема в том, что это не очень гладкая и с относительно высокой задержкой.Игра в многопользовательском режиме с MultipeerConnectivity очень медленная
И с большой задержкой я имею в виду, что изменения на подключенном телефоне не происходят сразу, но с задержкой, которая заставляет игру застревать.
Итак, чтобы начать просто: каждый раз, когда игрок касается экрана, узел должен перемещаться на обоих экранах. Поэтому, конечно, мне нужно отправлять сообщение каждый раз, когда пользователь прикасается к экрану. Так что в моем touchesBegan
метод я называю посыла-метод:
func sendMessage(dict:NSDictionary){
let messageDict = dict
let messageData = NSJSONSerialization.dataWithJSONObject(messageDict, options: NSJSONWritingOptions.PrettyPrinted, error: nil)
appDelegate.mpcHandler.session.sendData(messageData, toPeers: appDelegate.mpcHandler.session.connectedPeers, withMode: MCSessionSendDataMode.Reliable, error: nil)
}
Как что:
sendMessage(["moved":MoveDirection.Left.rawValue])
Затем я получаю его на другом устройстве и запустить функцию для обновления узла-позиции:
func handleReceivedDataWithNotification(notification:NSNotification){
let userInfo = notification.userInfo! as Dictionary
let receivedData:NSData = userInfo["data"] as NSData
let message = NSJSONSerialization.JSONObjectWithData(receivedData, options: NSJSONReadingOptions.AllowFragments, error: nil) as NSDictionary
if let mess: AnyObject = message.objectForKey("lostState"){
gameOver = true
createGameOverLabel(mess as String)
}else if let mess: AnyObject = message.objectForKey("higher"){
println(mess)
let coNumber = mess as Int
println(yourNumber)
if(coNumber > yourNumber){
leftAndRight = true
}else{
leftAndRight = false
}
}else if let mess:AnyObject = message.objectForKey("moved"){
var moved = mess as Int
var move = moveHeight/3
switch moved{
case MoveDirection.Left.rawValue:
moveNode.position.x -= move
case MoveDirection.Right.rawValue:
moveNode.position.x += move
case MoveDirection.Down.rawValue:
moveNode.position.y -= move
case MoveDirection.Up.rawValue:
moveNode.position.y += move
default:
break
}
}
}
Так что мой вопрос: я делаю что-то неправильно? Я протестировал его на реальном iPhone 6 и на реальном iPhone 5. Есть ли альтернативы, помимо GameCenter или другие способы, чтобы отправка/прием выполнялись быстрее?
Не знаю, что это будет иметь значение, но есть причина, чтобы использовать 'NSJSONWritingOptions.PrettyPrinted'. Вы лично не читаете json, поэтому добавление лишних пробелов и отступов приведет к тому, что пакеты будут отправлены больше. –
И протестируйте ping вашего соединения, посылая наименьший возможный пакет назад и вперед на некоторое время, измеряя время, необходимое для получения ответа. Это то время, когда вы не можете оптимизировать, и что-то выше, это время, потраченное на обработку вашего пакета. Я не удивлюсь, если 99,9% времени просто отстают из-за высоких пингов, особенно если соединение связано с эфиром/Интернетом, а не с Bluetooth или Wi-Fi. – LearnCocos2D