Какая частота обмена сообщениями между клиентом и сервером нужна для комфортной работы mmo?
Написал комет сервер и хочу приспособить его для организации браузерных игр.
Но у меня пока нормально работает если сведения на сервер отправлять с интервалом примерно 75мс если чаще то браузер начинает присылать сообщения по WebSocets с какими то флагами расширения и декодировать эти сообщения у меня не получается. А при интервале в 75мс видны рывки при перемещении персонажей.
Занимался интерполяцией и получилось что рывки начали быть заметны только при резкой смене направления движения.
И собственно в какую сторону развивать работу? Править сервер для повышения производительности или как то заглаживать проблему на клиенте?
Ведь отправлять сообщения с интервалом меньше 10мс на мой взгляд уже трудоёмко для браузера и js там ведь и другой код должен когда то работать.
Что за флаги расширения? Что-то я ничего подобного в доке по WebSocket-ам не нашел. Чем парсишь протокол на сервере?
Очень странная проблема я тоже с ней долго боролся и подозреваю что виной всему какая то проблема в в моей реализации серверной части.
Проявляется у меня проблема при высокой скорости отправки сообщений с клиента. Первые 5 или 10 сообщений приходят обычными а потом приходит сообщение в заголовке которого флаги RVS1 RVS2 RVS3 не равны нулю.
Как работать с такими сообщениями я не знаю.
Так как в большинстве случаев в веб разработке такая скорость отправки не нужна я пока не очень активно ищу проблему. Но хочется найти решение.
Особенно смущает отсутствие информации про эти флаги даже в описании протокола. Просто сказано что они для расширений а как работать не сказано. Как будто они реально не нужны и проблема исключительно у меня в коде.
Я использую C++ на сервере. но готового решения для с++ я не нашёл и по этому написал своё.
Levha
> флаги RVS1 RVS2 RVS3
флаги тоже твои самописные?
> смущает отсутствие информации про эти флаги даже в описании протокола
добавь, делов-то, свой код полезно иногда документировать : )
З.Ы.
вообще по-названию я бы предположил, что флаги эти резервные
http://greenbytes.de/tech/webdav/rfc6455.html#baseframing
скорее всего у тебя стрим съезжает, т.е. ты не учитываешь особенности ТСР и не перекладываешь "хвостики"
Что за ммо? Нонтаргет и управление с клавиатуры или управление кликом мыши, как в ла2?
Ну да кстати если с мышки кликать то 75мс интервал мне кажется достаточным.
Но я интересовался про управление с клавиатуры.
Levha
> если с мышки кликать то 75мс интервал мне кажется достаточным
Я при каждом клике по земле отправляю один пакет с проверкой доставки и все. И еще раз в секунду отправляю всем положение персонажа на сервере для коррекции. Получается в среднем 1-2 сообщения в секунду на клиента. Проблем с синхронизацией нет - все бегают как в ла2.
Levha
> Но я интересовался про управление с клавиатуры
Насколько я знаю, в ммо-слэшерах и шутерах эта проблема решается отправкой большого количества UDP пакетов, как раз те самые < 75 мс + интерполяция. У UDP нет проверки доставки, сеть пропускает в разы больше.
WebSokets построены поверх TCP, и там такое не прокатит. Самый очевидный вывод: делать экшн-ммо или шутер на TCP-based WebSockets - не самая лучшая идея. Если бы эту проблему можно было решить в рамках TCP, никто бы не мирился с потерей пакетов, и все пользовались TCP. Но решения для TCP, видимо, нет.
скорее всего у тебя стрим съезжает, т.е. ты не учитываешь особенности ТСР и не перекладываешь "хвостики"
Я вот тоже за это голосую:) Надо код вычитки пакета глядеть:)
wmask
Все так, в играх, где рассинхрон в пределах 100мс уже фатальный, используют UDP.
Пример - haxball.com, там рассинхрон даже в один пиксель может серьезно повлиять на игру и там UDP (правда, там p2p, но это не важно)
Levha, можете декомпильнуть хаксбол и взглянуть на реализацию синхронизации - из-за p2p там 'в одном флаконе' и клиентский код и как бы серверный (один из игроков хостит остальных в комнате). полезно.
Levha
> управление с клавиатуры
а чем оно принципиально отличается? : )
слать надо тока смену состояния с отжатого на нажатое и наоборот
Sh.Tac.
> а чем оно принципиально отличается? : )
Необходимой отзывчивостью и кол-вом значащих команд в секунду.
ты следил когда-нить за руками? : )
например в шутере
обычно нажаты максимум две клавиши, самый распространённый кейс такой, нажали и держим, причём гораздо дольше, чем упомянутые 75 мс (13 раз в секунду)
Sh.Tac.
Все равно движение по клику мышки - симулируется с нулевой погрешностью и требует пару десятков байт на один клик.
А движение по клавиатуре должно быстро реагировать на поворот мышки и нажатие клафиш, хотя бы со 50..100мс инерцией
-Eugene-
> движение по клику мышки - симулируется с нулевой погрешностью
ни разу, тоже нужен предикшн по-хорошему
это потому что клик редко бывает один, характерный пример, кликнули куда-нибудь далеко, на полпути передумали и кликнули ортогонально предыдущему пути
если ориентироваться тока на сервер, на клиенте будет характерный скачок положения
> движение по клавиатуре должно быстро реагировать на поворот мышки
это ближе к делу, в шутере основная тяжесть ввода приходится на постоянное отслеживание мыши, но мы тут за клавиатуру разговариваем : )
потому как неизвестно чего у автора за игра
З.Ы.
> хотя бы со 50..100мс инерцией
ключевое слово уже было сказано, интенсивность обмена никак не влияет на лаг, вернее даже влияет отрицательно, чем больше засираешь сеть, тем дольше ждёшь ответа
Всем большое спасибо. Пересмотрю код своего сервера.
На сколько я знаю, в данный момент средствами JavaScript нельзя отправить udp пакет и в моём случаи рационально мирится с ограничениями TCP чем переходить на работу с Flash.
Тема в архиве.