Показать сообщение отдельно
Старый 14.06.2014, 22:54   #6
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Сервер для 2D real-time игры

Сообщение от Nikich Посмотреть сообщение
Использую node.js + socket.io. Опыта до это вообще не имел, поэтому хочу послушать критики, так как уверен, что мой подход в разработке архитектуры сервера неверен.
Потчи "верный"..

Сообщение от Nikich Посмотреть сообщение
1).Клиент каждый фрейм отсылает на сервак данные о нажатых клавишах.
Если это нажатие WASD то у тебя два числа (вектор) направления. Слать нужно только когда они меняются. Например по стандарту вектор [ 0, 0 ], при нажатии D будет [ 1, 0 ], и только когда вектор меняется шли его.
Сервер же просто помнит направление перемещения, и если считает что юнит может двигаться - перемещает.
Если например нужно слать куда мы целимся, то тут слать нужно не чаще чем раз в 100/200 мс, это не критическая инфа, клиенты интерполируют.

Все зависит от механики перемещения и управления, опиши больше.

Сообщение от Nikich Посмотреть сообщение
2).Клиент слушает о приходе инфы с сервера касательно игровых объектов и делает следующее: старые данные пихает в P0, новые в P1.
Я обычно не храню старые. Для простоты проще иметь "текущие" и "новые". Вот есть текущая позиция, и двигаем к новой, если слишком далеко, то ускоряем, если совсем все "плохо", "варпим".

Сообщение от Nikich Посмотреть сообщение
3).Юзается линейная интерполяция по известным P1 и P0.
Если игра real-time с взаимодействием между игроками и зависимостью от положения, например FPS или шустрый Top Down, то прийдется учиться экстраполировать, иначе никто не будет попадать по врагам если у них лаг высокий.

Сообщение от Nikich Посмотреть сообщение
4).Сервак каждые 16 миллисек обрабатывает нажатие клавиш и игровую логику.
Зависит от механики игры, но даже FPS так часто не нужно. Логику лучше считать максимум 20 раз в секунду, а если это не супер активный экшон, то вообще можно 10 раз в секунду.

Сообщение от Nikich Посмотреть сообщение
5).Сервак каждые 48 миллисек отправляет все игровые данные всем клиентам.
Шли дельта данные позиций и т.п. также часто как и обновляешь их. При этом думай как пакуешь. JSON для начала ок, но потом нужно бинарно будет паковать.
Многие данные такие как присоединение игрока, или кто-то умер и т.п. не шли с данными обновления, а шли как независимые пакеты, простой event.

Опиши больше о игровой механики, т.к. обычно все зависит от нее.


Сообщение от radiobutton Посмотреть сообщение
Кстати, можете объяснить зачем нужны все эти node.js и прочие если есть java ?
И как твоя java решит вопросы заданные топик-стартером? Java в таких вещах сосет ты не представляешь как..
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Nikich (14.06.2014)