2015-02-19 2 views
0

Я разрабатываю многопользовательскую игру, используя 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 или другие способы, чтобы отправка/прием выполнялись быстрее?

+1

Не знаю, что это будет иметь значение, но есть причина, чтобы использовать 'NSJSONWritingOptions.PrettyPrinted'. Вы лично не читаете json, поэтому добавление лишних пробелов и отступов приведет к тому, что пакеты будут отправлены больше. –

+0

И протестируйте ping вашего соединения, посылая наименьший возможный пакет назад и вперед на некоторое время, измеряя время, необходимое для получения ответа. Это то время, когда вы не можете оптимизировать, и что-то выше, это время, потраченное на обработку вашего пакета. Я не удивлюсь, если 99,9% времени просто отстают из-за высоких пингов, особенно если соединение связано с эфиром/Интернетом, а не с Bluetooth или Wi-Fi. – LearnCocos2D

ответ

0

Я подозреваю, что ваша проблема заключается в том, что вы пытаетесь обновить пользовательский интерфейс из фонового потока, а не из основного потока. Эти результаты, по-видимому, длительные задержки до того, как пользовательский интерфейс отражает полученные данные.

Когда данные получены, didReceiveData: fromPeer вызывается в фоновом потоке, и если вы отправляете уведомление об этом методе, это не будет в потоке пользовательского интерфейса.

Попробуйте использовать dispatch_async

dispatch_async(dispatch_get_main_queue(), { 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "handleReceivedDataWithNotification:", name: "MPC_DidReceiveDataNotification", object: nil) 
}) 
+0

Похоже, что это работает. Спасибо за вашу помощь. Я обновил вопрос до быстрого эквивалента. – Christian

+0

Прошу прощения. Но это не работает. – Christian

Смежные вопросы