2015-08-19 6 views
4

Так что я делаю MMO, я много продвигался, 6 месяцев програмировал эту штуку. Проблема в том, что я тестировал офлайн свою игру, сегодня у меня есть блестящая идея портировать мой сервер и сделать его онлайн, я знал, что это будет немного медленнее, но его ужасно! слишком много отставания !!! игра неиграбельная. Im управляет моими пакетами так ...Сервер Udp слишком медленный?

Игрок хочет двигаться вверх, клиент отправляет movePacket на сервер, сервер получает его, перемещает игрока на сервер и отправляет новую позицию всем клиентам ... Каждый раз, когда движется монстр, сервер отправляет новую позицию всем клиентам ...

Я думал, что был старше отправки пакетов, но я тестирую его только с движением плеера ... похоже, значительная задержка, чтобы получить пакет и отправить их клиенту .... Im Я делаю все это неправильно?

ответ

4

Lag всегда связан с онлайн-играми. Хотя ваш текущий метод является стандартным способом делать что-то, так как ваше обнаружение отставания становится невыносимым (общая проблема в играх 1990-х и начале 2000-х годов). Самый лучший подход - это тот же подход, что и почти все современные игры, которые делают столько, сколько вы можете на стороне клиента, и используете только свой авторитетный сервер для устранения различий между прогнозами, которые делают клиенты. Вот несколько полезных способов снижения воспринимаемой лаг:

  1. стороне клиента прогнозирования
    Для MMO это может быть все, что вам нужно. Основная идея прогнозирования на стороне клиента - это локально выяснить, что делать. В вашей игре, когда игрок хочет двигаться вверх, он отправляет пакет, в котором говорится [request: 1 content: moveup], затем, прежде чем получать ответ от сервера, клиент отображает Player, перемещающийся один (если вы уже не можете сказать, что такой ход недействительно, т. е. перемещение вверх означало бы бег в стену). Если ваш сервер действительно медленный, игрок также может двигаться прямо перед тем, как получить ответ, поэтому ваш пакет следующего пакета может выглядеть как [request: 2 content: moveright], в этот момент вы показываете плеер справа. Имейте в виду, что в этот момент игрок уже переместился вверх и прямо до того, как сервер даже подтвердил, что перемещение вверх является допустимым шагом. Теперь, если сервер отвечает, что новая позиция игрока после пакета 1 должна быть поднята, а позиция после пакета 2 должна быть права, все хорошо. Однако, если можно сказать, что шаги другого игрока превышают Player, тогда сервер может ответить игроком в новом месте. В этот момент игрок будет «телепортироваться» туда, где сервер говорит ему, что он должен быть. Это происходит не часто, но когда это происходит, это может быть чрезвычайно заметно (вы, вероятно, заметили это в коммерческих играх fps).

  2. Interpolation
    На данный момент ваш, вероятно, отлично подходит для MMO-игры, но в случае, если он не является (или для будущей ссылки), ваш следующий шаг. Здесь идея отправить больше данных о ставках, по которым изменяются значения, чтобы сделать движение других игроков более плавным. Это та же концепция, что и использование серии тайлов в математике для прогнозирования значений для функции. В этом случае вы можете отправить позицию, а также скорость и, возможно, даже данные ускорения для всех объектов в игре. Таким образом, новое положение можно рассчитать как x = x + v * t + 0,5 * a t t где t - частота кадров. Опять же, вы показываете предсказанную позицию игрока, прежде чем сервер действительно подтвердит, что это правильная позиция. Когда приходит следующий пакет с сервера, вы неизбежно будете ошибаться большую часть времени, но чем больше данных о скорости передачи вы будете отправлять, тем меньше вы будете отключены и, следовательно, тем меньше телепортация других объектов.

Если вы хотите получить более подробный план о том, как иметь дело с отставанием в онлайн-играх читать мини-библию на многопользовательской игры: http://www.gabrielgambetta.com/fast_paced_multiplayer.html

+0

Лучший ответ когда-либо! Спасибо, спасибо, теперь у меня есть идея ... Ps: Я попытался ответить на ваш ответ, он говорит, что мне нужно 15 rp tss! – centenond

+0

Нет проблем, я думаю, вы должны иметь возможность отметить его как правильное, так что оно правильно отображается в фильтрах и поисковых системах – Alex

Смежные вопросы