Обновление состояния игры в многопользовательской игре

Я работаю над многопользовательской игрой. У каждого клиента есть персонаж, который перемещается в общей среде.
Я использую socket.io для создания комнат и peer.js для создания однорангового соединения между клиентами.
Я пытаюсь дать возможность каждому клиенту обновлять позиции персонажей других игроков на своей карте.
Для этого у каждого клиента должно быть состояние курсоров клавиатуры (клавиш со стрелками) другим игрокам, чтобы он мог перемещать соответствующих персонажей с анимацией ходьбы.

P2P: я думаю о создании дуплексных потоков между клиентами, чтобы у каждого клиента было состояние курсоров клавиатуры других игроков, чтобы он мог перемещать своих персонажей с соответствующей анимацией ...
РОЗЕТКИ: Я могу также передавать информацию через сервер с помощью сокетов, но мне придется отправлять обновление состояния курсоров 60 раз в секунду, так как игра работает на 60 кадрах в секунду, что создает много сообщений сокетов. Я не уверен, что это самый эффективный способ справиться с этим

Как наиболее эффективно держать всех в курсе состояния других игроков? Любое предложение будет оценено по достоинству. Спасибо.


person Achraf El Khamsi    schedule 14.02.2021    source источник


Ответы (1)


На самом деле ваша игра, скорее всего, представляет собой небольшую демонстрацию MMORPG или чего-то вроде CS / CSGO.

Для такой игры у нас всегда есть цикл основного процесса (рабочего процесса) с частотой вроде нескольких кадров в секунду (скажем, 20 кадров). В каждом кадре клиент будет обрабатывать пакеты, полученные от других, и параметры плеера.

Если здесь 20 кадров, это означает, что каждый кадр не может быть больше 50 мс, поэтому это вызовет некоторую задержку, если он находится в WLAN, и некоторые пакеты будут сброшены.

Если вы хотите использовать P2P для синхронизированных действий игроков, вот проблема: когда количество игроков резко увеличивается, сложности соединения тоже усиливаются. Более того, вам нужен надежный протокол соединения, а это значит, что вам нужно знать, как использовать что-то вроде QUIC или самостоятельно писать надежный UDP.

Поэтому я думаю, что наиболее эффективным способом будет продолжать использовать модель C / S вместо P2P, только если ваша игра будет использоваться в локальной сети и в ней довольно много игроков.

person tyChen    schedule 14.02.2021
comment
Я понимаю. А для пакетов, совместно используемых игроками, является ли обычной практикой совместное использование состояния курсоров или разделение положения персонажей на карте? Если я просто поделюсь позицией, я не увижу, как можно плавно воспроизвести движущуюся анимацию. - person Achraf El Khamsi; 14.02.2021
comment
Вот почему C / S лучше, он транслирует новую позицию игрока вокруг вас в какой-то определенной области каждый кадр, а не транслирует всем каждый раз, когда какой-то переход по p2p. - person tyChen; 14.02.2021
comment
Я имею в виду, что я также могу использовать C / S для трансляции хода (или отсутствия хода) игрока в каждом кадре ... но для точности я думаю, что лучше транслировать позицию. Постараюсь работать с моделью C / S .. - person Achraf El Khamsi; 14.02.2021
comment
Вы должны знать, что истинная точность не нужна, потому что наш человек не может чувствовать что-то подобное, а рама - это компромисс для баланса. - person tyChen; 14.02.2021
comment
Я работал с моделью C / S. Каждый игрок отправляет свои координаты в каждом кадре на сервер, который передает информацию игрокам в одной комнате. Это сработало отлично! - person Achraf El Khamsi; 16.02.2021
comment
Это хорошо! А когда ваша игра становилась все более сложной, вам нужно будет отсоединить центральную петлю, но в последнее время это для вас немного далеко. - person tyChen; 16.02.2021
comment
Есть ли у вас хорошие ресурсы, где я могу узнать больше об управлении многопользовательским режимом, особенно для сложной игры с большим количеством пользователей ... потому что, даже если он работает нормально прямо сейчас, я мог видеть, что было бы проблематично, если бы количество игроков взрывается .. - person Achraf El Khamsi; 19.02.2021
comment
Если игра предназначена для продажи / зарабатывания денег, лучший способ для этого - купить устройства получше, это относительно дешево и легко. Если вы хотите оптимизировать программу своей игры, тогда, когда количество игроков быстро растет, вам может понадобиться распределенная система или разделение игроков по разным зонам, например WOW. - person tyChen; 19.02.2021