Node.js игровая логика

Я делаю многопользовательскую гоночную игру в реальном времени. Теперь мне нужна помощь в написании игровой логики на Node.js TCP (net) сервере. Я не знаю, возможно ли это, я не знаю, правильно ли я это делаю, но я стараюсь изо всех сил. Я знаю, что трудно понять мой ломаный английский, поэтому я сделал эту "картину":)
Спасибо за ваше время
Proccess

3 ответа

Решение

Чтобы уточнить ответ дрюшкина, вы должны использовать удаленные вызовы процедур (RPC) и очередь событий. Это работает так же, как на изображении, которое вы разместили, где каждый пакет представляет собой "команду" или RPC с некоторыми аргументами (т. Е. Направление движения). Вам также понадобится очередь событий, чтобы убедиться, что RPC выполняются по порядку и в срок. Это потребует метки времени или подсчета кадров для каждой команды, которая будет выполняться (в какой-то момент в будущем, в простой схеме), и синхронизированных часов (стиль Второй мировой войны).

Вы можете заметить один критический недостаток в этой схеме: сообщения RPC могут быть запоздалыми (приходить после того времени, когда они должны быть применены) из-за задержки в сети, злоумышленников и т. Д. В простой схеме поздние RPC отбрасываются. Это нормально, поскольку все клиенты (даже отправитель!) Ждут, пока сервер отправит RPC, прежде чем действовать (если исходящий клиент не ждал сообщения от сервера, его игровое состояние будет не синхронизировано с сервером, и ваш игра будет сломана).

Рассмотрим влияние лага на такую ​​схему. Допустим, задержка клиента A на сервере составляла 100 мс, а обратная поездка также составляла 100 мс. Это означает, что клиентский ввод выглядит так:

  • Клиент A нажимает клавишу и отправляет RPC на сервер, но не добавляет его локально (0 мс)
  • Сервер получает и ретранслирует RPC (100 мс)
  • Клиент A получает свое собственное событие и, наконец, добавляет его в свою очередь событий для обработки (200 мс)

Как вы можете видеть, клиент реагирует на свое собственное событие через 1/5 секунды после нажатия клавиши. Это с довольно хорошим лагом в 100 мс. Трансокеанская задержка может легко превышать 200 мс в одну сторону, а соединения удаленного доступа (редко, но все еще существуют сегодня) могут иметь пики задержки> 500 мс. Ничего из этого не имеет значения, если вы играете в локальной сети или что-то подобное, но в Интернете эта безответственность может быть невыносимой.

Вот где приходит понятие предсказания на стороне клиента (CSP). CSP задуман как большой и пугающий, но реализованный правильно и продуманно, на самом деле он очень прост. Интересной особенностью CSP является то, что клиенты могут обрабатывать свои данные немедленно (клиент предсказывает, что произойдет). Конечно, клиент может (и часто будет) ошибаться. Это означает, что клиенту потребуется способ применения исправлений с Сервера. Это означает, что вам потребуется способ проверки, отклонения или изменения RPC-запросов от клиентов на сервере, а также способ сериализации игрового состояния (чтобы его можно было восстановить в качестве базовой точки для повторного моделирования).

Есть много хороших ресурсов об этом. Мне особенно нравится http://www.gabrielgambetta.com/?p=22, но вам действительно стоит поискать хорошую книгу по программированию многопользовательских игр.


Я также должен предложить socket.io даже после прочтения ваших комментариев относительно Flex и AS3. Простота использования (и простая интеграция с узлом) делают его одним из лучших (лучших?) Вариантов для сетевых игр по HTTP, который я когда-либо использовал. Я бы сделал все необходимые корректировки, чтобы иметь возможность использовать его. Я считаю, что в AIR/AS3 есть хотя бы одна библиотека WebSockets, даже если сама socket.io недоступна.

Это звучит как что-то для http://socket.io/. Это библиотека, которая предоставляет вам возможности в реальном времени в браузере и на вашем сервере.

Вы можете смоделировать это в commands в events: клиент отправляет команду move на сервер, затем сервер проверяет эту команду и, если все в порядке, он публикует событие is moving,

В вашем случае, вероятно, нет необходимости в разных ответах на P1 (хорошо, вы можете двигаться) и остальным (P1 движется), последнего достаточно в обоих случаях. is moving Событие должно содержать всю необходимую информацию (например, текущую позицию, скорость и т. д.).

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

Другие вопросы по тегам