Game Kit Peer to Peer - PullRequest
       17

Game Kit Peer to Peer

5 голосов
/ 27 октября 2011

Я кодировал приложение Bomberman, которое использует одноранговое соединение GameKit. Проблема в том, что через некоторое время игра перестает синхронизироваться.

Я посмотрел пример кода для GKTanks и использовал их модель. Между пирами нет отношения клиент / сервер, поэтому я не использовал его в своей игре. Оба партнера поддерживают состояние игры, которое они обновляют на основе полученных данных.

У меня есть NSTimer, который используется для запуска игрового цикла в каждом кадре. NSTimers не синхронизированы, поэтому иногда игровые состояния становятся другими, например: игроки получают включение примерно в одно и то же время, и оба получают включение, потому что для отправки данных требуется некоторое время.

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

Спасибо!

РЕДАКТИРОВАТЬ: я изменил код, так что случайный игрок выбран в качестве хоста. Каждый раз, когда игрок кладет бомбу, он спрашивает сервер, где ее разместить. Сервер возвращает позицию игрока (как видно на сервере), а затем сообщает игроку, где разместить бомбу.

Для бонусов сервер проверяет, получил ли игрок бонусы и посылает ли он пакет, информирующий его.

Теперь появилась другая проблема. Задержка между устройствами высока (я использую соединение Bluetooth). После того, как клиент нажал на кнопку, чтобы разместить ее, требуется около 0,2 секунды, чтобы разместить бомбу.

Я отправляю все данные надежно. Я правильно это делаю?

Ответы [ 2 ]

4 голосов
/ 27 октября 2011

Желательно, чтобы вы предпочитали отношения хост-клиент, когда только хост может манипулировать состоянием игры, поэтому в вашем случае это будет:

Оба игрока спешат на усиление.Хост забирает его первым.
Он регистрируется, и хост получает питание.
Тем временем игрок # 2 также получает питание и отправляет действие хосту.
Хост информирует игрока# 2, что включение уже исчезло.

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

В такой игре, как Bomberman, вполне возможно отправлять все игровое состояние каждый раз, когда что-то меняется, вместо того, чтобы было выполнено действие, чтобы гарантировать синхронизацию обоих устройств.

Подводя итог: у обоих пользователей есть игровое состояние, но только хост может манипулировать обоими.

0 голосов
/ 15 ноября 2011

что вы должны сделать:

  • одно из устройств является хостом, другое - клиентом
  • хост обрабатывает все состояния игры и принимает решения, затем отправляет все игровое состояние вклиент
  • клиент получает игровое состояние и просто рисует все на его основе - он не принимает никаких решений (кто выбрал бомбу, бомба взорвалась и т. д.)
  • клиент просто отправляет данные на хост (нажатавлево, вправо, пауза и т. д.)

вот и все.если вы попытаетесь принять решение на обеих машинах, вы столкнетесь с большими проблемами, пытаясь синхронизировать их.

...