Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Браузерная игра (https://javascript.ru/forum/offtopic/40399-brauzernaya-igra.html)

Murdoc 03.08.2013 20:35

Браузерная игра
 
Не имею опыта создания.
Игра простая: кораблик летает и стреляет. Игра мультиплеерная работает по ws

Суть любой мультиплеерной игры получать команды от пользователя, преобразовывать их в данные и отображать пользователям результат. Только вот где преобразовывать команды пользователя в данные?

Предположим, что команды пользователя(cmd) это объект с нажатыми клавишами:
{
  w: true,
  a: false,
  s: false,
  d: false 
}


Набор данных(result) - координаты где находится игрок в 2D:
{
  x: 200,               // по x
  y: 200,               // по y 
  rotation: 90        // градусы направления
}



Как лучше распределить нагрузку, где из cmd получать result:
1 Client -> (result) -> Server -> (results) -> Client
2 Client -> (cmd) -> Server -> (cmds) -> Client
3 Client -> (cmd) -> Server -> (results) -> Client

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

Плюсы от первой схемы:
1 Не нагружает сервер
2 Не нагружает клиент (не нужно производить вычисление данных каждого из игроков!)

Минусы:
1 На игру можно повлиять(отправить с клиента ложные данные)

Или вторая схема - команды преобразуются в данные уже после того как придут с сервера. Минус от такой схемы - с сервера приходят команды от всех игроков и нужно успеть преобразовать их в данные и отобразить визуально (и все это за менее чем 60ms)

Третья схема:
Вся нагрузка на сервер. Сервер - важное звено, он теперь передает, а также хранит и обрабатывает данные.
Минусы: при большом количестве игроков сервер может не выдержать нагрузки

Какая схема лучше или предложите свой вариант.

Murdoc 04.08.2013 11:15

да, но в таком случае нагрузка от каждого пользователя перейдет на сервер. Когда пользователей 10 это терпимо, а когда 1000 уже ощутимо.
Или это не та нагрузка о которой стоит переживать?

cyber 04.08.2013 15:17

Цитата:

Сообщение от Murdoc
да, но в таком случае нагрузка от каждого пользователя перейдет на сервер. Когда пользователей 10 это терпимо, а когда 1000 уже ощутимо.
Или это не та нагрузка о которой стоит переживать?

Но если вы ее не перенесете тогда любой игрок сможет махлевать.
во тут https://developer.valvesoftware.com/..._Networking:ru описанно как работает движок в CS

Murdoc 05.08.2013 09:32

Цитата:

Сообщение от Дзен-трансгуманист (Сообщение 265741)
Ну если вы делаете свою стрелялку just for fun, то 1000 игроков онлайн там наберется только если очень-очень не повезет. :)

ну много популярных проектов появилось из just for fun)

было бы полезно перед тем как начинать что-то серьезное "прощупать почву")
Например, если вчера я отправлял на сервер команды в таком виде:
{
  w: true,
  a: false,
  s: false,
  d: false 
}


сегодня уже в таком:
['forward']


:)

Murdoc 05.08.2013 09:33

Цитата:

Сообщение от cyber (Сообщение 265780)
Но если вы ее не перенесете тогда любой игрок сможет махлевать.
во тут https://developer.valvesoftware.com/..._Networking:ru описанно как работает движок в CS

ссылка очень полезная, благодарю!

cyber 05.08.2013 10:17

Murdoc,
пробывать можно, но для серьезной игры такой вариант не подойдет.
и вот еще http://habrahabr.ru/post/182678/

deivan 05.08.2013 12:35

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

Murdoc 05.08.2013 21:08

Цитата:

Сообщение от cyber

да, я тоже сегодня на нее наткнулся, правда так и не понял зачем задержка в 75 секунд, чтоб анимация имела плавный переход и все? видимо узнаю это при тестах)

Цитата:

Сообщение от Дзен-трансгуманист
Использовать двоичное кодирование всегда было хорошей практикой.

думаю это лишнее)
массив из 3-х и менее команд куда понятней)

Цитата:

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

да, у меня для этого socket.io..

Murdoc 06.08.2013 10:13

:)


Часовой пояс GMT +3, время: 20:41.