2015-10-04 2 views
3

Я строил игру в игровой центр для iOS, и она отлично работает до сих пор. Я, наконец, начал тестировать игру и theres (очевидно) некоторую задержку, что приводит к тому, что игра не синхронизирована.Игра в игровой центр iOS не синхронизирована

В основном у меня есть 2 игрока, каждый из которых управляет игровым персонажем. Игровой персонаж может снимать огненные шары и ледяные шары и т. Д. Эти атаки наносят урон, и у них есть эффекты. Например. эффект ледяного шара заморозит противника в течение 3 секунд, если он вступает в контакт. огненный шар увеличит урон от огня в течение 3 секунд.

так что проблема в том, что когда я играл против моего брата, из-за латентности моя игра говорила, было 20.

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

В настоящее время я использую стандартную архитектуру игрового центра по принципу «равный-равному». Будет ли использование архитектуры клиент-сервер (один человек станет сервером) решить эту проблему несинхронизации?

Если нет, то какие у меня есть варианты с API набора игр?

+0

Вы используете соединение tcp или udp? –

+0

@JiriTrecak не уверен фактически. Позвольте мне дважды проверить –

+0

@JiriTrecak Я думаю, что он использовал tcp. будет ли использовать udp сделать передачу или данные намного быстрее? –

ответ

1

Я нашел решение этой проблемы.

Примечание: это будет относительно длинный ответ.

Единственная вещь, которую я реализовал, это использование udp для некоторых из моих передач данных, которые не так критичны, как другие. Например, поскольку я отправляю данные о движении примерно 10 раз в секунду, я решил, что его нормально, если 1 или 2 из 10 будут потеряны раз в то время.


Теперь к актуальной проблеме:


Так что происходило это так включено следующее: Я использую p2p архитектуры, как клиенты имеют задержку, когда они видят игру " Мир'. Это означает, что на моем устройстве я вижу вражеского игрока в положении, которое задерживается на 100-200 миллисекунд. (так он был на самом деле там 100-200 мс в прошлом).

Проблема с этим, когда я стреляю в снаряд врага, и я вижу столкновение, если столкновение было прямо на краю его спрайта (его ног или головы), на его экране он уже был прошлая эта позиция - PLUS - мой огненный шар появляется на 100 мс на экране. Это означает, что на его устройстве он смог уклониться от моей атаки. Это может случиться случайным числом раз, но я предполагаю, что он, вероятно, ниже 30% времени. 70%, оба устройства видят столкновение.


Раствор


То, что я придумал, чтобы отправить сообщение другому игроку, когда либо устройство видит столкновение. И помните, что каждое устройство не имеет понятия, видел ли другой столкновение или нет. Поэтому у меня нет способа узнать, видели ли оба устройства столкновение, или только 1, а другие видели, что атака была уклонилась.

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

Чтобы обойти это, я добавил «количество заклинаний» для каждого заклинания/атаки, и когда происходит столкновение, я сохраняю это число с игроком, с которым столкновение произошло с «последним номером заклинания столкновения», , Поэтому, если столкновение происходит с этим заклинанием, игрок знает, что он/она уже столкнулся с этим конкретным объектом, поэтому логика столкновения не работает дважды.

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