|
Алгоритмика Об алгоритмах вообще; методы, обсуждения способов решения |
14.06.2014, 01:01
|
#1
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Сервер для 2D real-time игры
Использую node.js + socket.io. Опыта до это вообще не имел, поэтому хочу послушать критики, так как уверен, что мой подход в разработке архитектуры сервера неверен.
В общем, как все работает:
1).Клиент каждый фрейм отсылает на сервак данные о нажатых клавишах.
2).Клиент слушает о приходе инфы с сервера касательно игровых объектов и делает следующее: старые данные пихает в P0, новые в P1.
3).Юзается линейная интерполяция по известным P1 и P0.
4).Сервак каждые 16 миллисек обрабатывает нажатие клавиш и игровую логику.
5).Сервак каждые 48 миллисек отправляет все игровые данные всем клиентам.
Как сие дело улучшить?
|
(Offline)
|
|
14.06.2014, 01:13
|
#2
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Сервер для 2D real-time игры
Есть интересные туторы по player.io, может теория из них тебе пригодится http://www.ant-karlov.ru/PlayerIO-si...a-igrokov.html
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
14.06.2014, 03:20
|
#3
|
Бывалый
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений (для 546 пользователей)
|
Ответ: Сервер для 2D real-time игры
Кстати, можете объяснить зачем нужны все эти node.js и прочие если есть java ?
|
(Offline)
|
|
14.06.2014, 04:49
|
#4
|
Быдлокодер
Регистрация: 05.07.2009
Адрес: Проспит
Сообщений: 5,023
Написано 2,312 полезных сообщений (для 5,349 пользователей)
|
Ответ: Сервер для 2D real-time игры
Сообщение от radiobutton
Кстати, можете объяснить зачем нужны все эти node.js и прочие если есть java ?
|
Для явы нужна ява машина, а нод будет выполнятся на веб-сервере.
|
(Offline)
|
|
14.06.2014, 13:44
|
#5
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Сервер для 2D real-time игры
С таким же успехом можно сказать: зачем ява, если есть плюсы?
|
(Offline)
|
|
14.06.2014, 22:54
|
#6
|
.
Регистрация: 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)
|
|
Сообщение было полезно следующим пользователям:
|
|
14.06.2014, 23:26
|
#7
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Сервер для 2D real-time игры
Игра быстрая, вид сбоку, есть прыжки.
По второму пункту, да, я это и имел ввиду.
А можно подробнее об экстраполяции? Если игрок двигается только при нажатой клавише и прыжке, то экстраполировать получится только прыжки, да?
И ещё вопрос, касательно TCP. Насколько я знаю, браузеры в UDP не умеют, а значит, точно придется использовать TCP, который куда медленнее UDP. Сейчас сервер поднимаю на своем компе, инет совсем не сильный( 4 мбита прием, 0.5 отдача ). Средний пинг -- 40-60, но иногда скачет до 300. Связано ли это с TCP( как мне известно, он будет ждать до тех пор, пока пакет точно не отправится, что точно может поднять пинг ) и можно ли это пофиксить улучшением пропускной способности сервера?
|
(Offline)
|
|
15.06.2014, 01:19
|
#8
|
Мастер
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений (для 504 пользователей)
|
Ответ: Сервер для 2D real-time игры
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
15.06.2014, 15:43
|
#9
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Сервер для 2D real-time игры
Сообщение от Nikich
Игра быстрая, вид сбоку, есть прыжки.
|
Зависит на сколько шустро перемещаются, если как в Tee World, то да, тут экстраполяция очень важна.
Сообщение от Nikich
А можно подробнее об экстраполяции? Если игрок двигается только при нажатой клавише и прыжке, то экстраполировать получится только прыжки, да?
|
Наоборот. Экстраполировать движение проще, чем действие по нажатию, такое как прыжок или выстрел из рэйлгана.
В общем есть "сетевая политика", я 3 раза уже писал в разных местах на форуме. То что тебе нужно это чтоб сервер делал симуляцию игры, при этом эта симуляция будет сичтаться "главной", далее рассылая данные клиентам, они должны предсказывать данные в будущее о других клиентах, в будущение на продолжительность времени их пинга. Если пинг 200+ то никакая игра уже не будет нормально играться.
Предсказывать (экстраполировать) нужно так чтобы все клиенты старались иметь "идентичную" симуляцию с сервером в реальном времени. В вебе симулировать задержку просто - поставь таймеры при отправке пакета и при получении (до обработки пакетов), тестируй как со стабильной долгой задержкой (120 мс например), так и с "шумной" (100 +/- 80).
Экстраполяция - это предсказывание. Методов много, у тебя будут скорее всего spline'ы, я для простоты делал так: если прошлые данные, текущие, и я предсказываю точку где будет игрок исходя из этих данных, всякие бизье для твоего варианта хорошо подойдут.
Сообщение от Nikich
И ещё вопрос, касательно TCP. Насколько я знаю, браузеры в UDP не умеют, а значит, точно придется использовать TCP, который куда медленнее UDP. Сейчас сервер поднимаю на своем компе, инет совсем не сильный( 4 мбита прием, 0.5 отдача ). Средний пинг -- 40-60, но иногда скачет до 300. Связано ли это с TCP( как мне известно, он будет ждать до тех пор, пока пакет точно не отправится, что точно может поднять пинг ) и можно ли это пофиксить улучшением пропускной способности сервера?
|
Забей про это, просто забей. Т.к. на самом деле когда народ "доводит" их UDP до стабильного состояния (RUDP), то по производительности получается один хрен.
Если WebRTC - но это другая фигня.
Если ты делаешь игру на реакцию, и хочешь чтобы игрок с пингом 150+ не имел лагов, тут UDP не поможет. Ты ничего не можешь сделать с его интернетом, в Web'е это или Native'ное приложение. Почти все игры на мобилках (нативные) что имеют realtime мультиплеер, требуют играть по WiFi, и не разрешают 3G/4G, по очевидным причинам.
Следственно твоя игра должна ставить перед фактом - "говно интернет - не поиграешь".
На вопросы протокола на ранних стадиях вообще не задумывайся.
http://tanks.moka.co/ - работает ок, интерполяция, 20 UPS (Update Per Second).
http://moka.co/beatemup/ - тоже ок, чуток похуже т.к. нету сглаживаний перемещения и т.п. (намеренно) 10 UPS при этом весьма играбельно на 3G. Тут геймплей важен для такого. (открой 4 закладки игры).
http://boxes.moka.co/ - тут вообще нету цикла и физика считается на клиентах, сервер - обменная точка. Частота отсылки данных с клиента 10 UPS.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
|
|
15.06.2014, 16:27
|
#10
|
Бывалый
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений (для 546 пользователей)
|
Ответ: Сервер для 2D real-time игры
Сообщение от Nikich
С таким же успехом можно сказать: зачем ява, если есть плюсы?
|
Ява простая. Миллион библиотек.
Сообщение от moka
И как твоя java решит вопросы заданные топик-стартером? Java в таких вещах сосет ты не представляешь как..
|
В яве нету сокетов или что?
миллион фришек l2 написаны на яве. И как то работают с большим онлайном.
Сообщение от Arton
Для явы нужна ява машина, а нод будет выполнятся на веб-сервере.
|
Что есть веб-сервер?
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
15.06.2014, 16:31
|
#11
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Сервер для 2D real-time игры
Сообщение от radiobutton
Ява простая. Миллион библиотек.
|
node.js проще, в разы, и модулей на него ни сколько не меньше.
Сообщение от radiobutton
В яве нету сокетов или что?
|
При чем тут это? У топик-стартера вопросы не по сети, а по логике.
Сообщение от radiobutton
миллион фришек l2 написаны на яве. И как то работают с большим онлайном.
|
И миллион фришек написаны на node.js.
radiobutton, иди оффтопь в другое место, тут человека интересует конкретные вопросы, а не твоя java. Будешь дальше офтопить, вынесу в другую тему.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
15.06.2014, 20:09
|
#12
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Сервер для 2D real-time игры
Я верно понимаю, что система на стороне клиента должна быть тогда такой:
1). Интерполируем каждый кадр от старых данных к новым.
2). Если в текущем кадре мы дошли до новых данных, а следующие ещё не пришли - экстраполируем, зная нажатые клавиши игроков.
Так, да?
|
(Offline)
|
|
15.06.2014, 22:50
|
#13
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Сервер для 2D real-time игры
Сообщение от Nikich
Я верно понимаю, что система на стороне клиента должна быть тогда такой:
1). Интерполируем каждый кадр от старых данных к новым.
2). Если в текущем кадре мы дошли до новых данных, а следующие ещё не пришли - экстраполируем, зная нажатые клавиши игроков.
Так, да?
|
Если интерполяции будет тебе достаточно, то да, но тут тоже нужно иметь ограничение, например 300мс - это уже перебор. Обычно игры делают 1 секунду таймаут - если не было сообщений, заморозить все.
Я лично просто интерполировал и все, никаких заморочек с продолжением.
Дам совет - сделай минимум играбельной демки, сетевую часть делай как можно проще не заморачивайся. Выложи. И только потом смотри что нужно, а что не нужно улучшать.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
15.06.2014, 23:01
|
#14
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,360
Написано 2,473 полезных сообщений (для 6,856 пользователей)
|
Ответ: Сервер для 2D real-time игры
Сообщение от Arton
а нод будет выполнятся на веб-сервере.
|
Нет, ты
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
|
(Offline)
|
|
15.06.2014, 23:52
|
#15
|
Мастер
Регистрация: 03.05.2010
Адрес: Подмосковье
Сообщений: 1,218
Написано 438 полезных сообщений (для 790 пользователей)
|
Ответ: Сервер для 2D real-time игры
Забей про это, просто забей. Т.к. на самом деле когда народ "доводит" их UDP до стабильного состояния (RUDP), то по производительности получается один хрен.
|
Хм. Идеологически UDP лучше подходит для сетевой игры. Если пакет потерялся, фиг с ним. Иначе пока будем проверять, что он дошёл, и пересылать заново, информация устареет.
__________________
О¯О ¡¡¡ʁɔvʎнdǝʚǝdǝu dиW
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 21:32.
|