Я нашел решение этой проблемы.
Примечание: это будет относительно длинный ответ.
Единственная вещь, которую я реализовал, это использование udp
для некоторых из моих передач данных, которые не так критичны, как другие. Например, поскольку я отправляю данные о движении примерно 10 раз в секунду, я решил, что его нормально, если 1 или 2 из 10 будут потеряны раз в то время.
Теперь к актуальной проблеме:
Так что происходило это так включено следующее: Я использую p2p
архитектуры, как клиенты имеют задержку, когда они видят игру " Мир'. Это означает, что на моем устройстве я вижу вражеского игрока в положении, которое задерживается на 100-200 миллисекунд. (так он был на самом деле там 100-200 мс в прошлом).
Проблема с этим, когда я стреляю в снаряд врага, и я вижу столкновение, если столкновение было прямо на краю его спрайта (его ног или головы), на его экране он уже был прошлая эта позиция - PLUS - мой огненный шар появляется на 100 мс на экране. Это означает, что на его устройстве он смог уклониться от моей атаки. Это может случиться случайным числом раз, но я предполагаю, что он, вероятно, ниже 30% времени. 70%, оба устройства видят столкновение.
Раствор
То, что я придумал, чтобы отправить сообщение другому игроку, когда либо устройство видит столкновение. И помните, что каждое устройство не имеет понятия, видел ли другой столкновение или нет. Поэтому у меня нет способа узнать, видели ли оба устройства столкновение, или только 1, а другие видели, что атака была уклонилась.
Это означает, что я должен отправлять сообщение другому игроку каждый раз, когда возникает конфликт. Теперь, из-за того, как я сконструировал свою игру, когда отправлено столкновение, я автоматически применяю событие столкновения (что означает нанесенный урон, эффект снаряда, который имел место, - например, ледяной болт, замораживающий игрока, с которым он столкнулся). является проблематичным, потому что, если оба устройства увидели столкновение. Это означает, что оба устройства посылают друг другу сообщение о столкновении и снова применяют коллизии.
Чтобы обойти это, я добавил «количество заклинаний» для каждого заклинания/атаки, и когда происходит столкновение, я сохраняю это число с игроком, с которым столкновение произошло с «последним номером заклинания столкновения», , Поэтому, если столкновение происходит с этим заклинанием, игрок знает, что он/она уже столкнулся с этим конкретным объектом, поэтому логика столкновения не работает дважды.
Вы используете соединение tcp или udp? –
@JiriTrecak не уверен фактически. Позвольте мне дважды проверить –
@JiriTrecak Я думаю, что он использовал tcp. будет ли использовать udp сделать передачу или данные намного быстрее? –