Sign in to follow this  
Followers 0
odosenok

Синхронизация игрока с сервером

1 post in this topic

1. Введение.

Всем читающим этот пост известна игра Grand Theft Auto. GTA San Andreas появилась в 2004 году. GTA Criminal Russia появилась пару лет спустя. Все мы играли сначала в одиночную игру, где кто-то проходил миссии, кто-то смеха ради убивал других людей. Временами проявлялся интерес поработать водителем скорой медицинской помощи, сотрудником правоохранительных органов, пожарным или обычным таксистом.

 

Вскоре вышел мультиплеер к данной игре. И именно тогда игра стала мультиплеерной (многопользовательской). Ровным счетом также мы заходили в игру, правда теперь через мультиплеер, и играли уже с другими людьми. А много ли кто из Вас задумывался насчет того, как устроена сама игра? Как происходит взаимодействие между игроками (почему мы видим перемещения и прочие действия других игроков)? 

 

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

 

2. Пакеты данных.

Представьте себе хороший денек, в который у Вас предостаточно времени, чтобы поиграть в Grand Theft Auto по сети. Вы открываете мультиплеер. Выбираете интересующий Вас сервер. Игра уже начинает запускаться... Появляются логотипы... Загрузочный экран. И тут, когда появляется непосредственно строка с подключением к серверу, клиент отправляет первый пакет на сервер.

 

Вероятно всего, для многих из Вас пакет - новое слово. Важно понять его смысл, поскольку обращаться к нему мы будем довольно-таки часто. Пакет (пакет данных) - блок данных, содержащий в себе ряд запросов, которые следует применить к серверу или клиенту. С помощью пакетов и происходит взаимодействие игрока с сервера. Так, игрок посылает пакеты о том, что подключился к серверу, изменил свое местоположение (координаты, угол поворота головы), что отправил какое-либо сообщение в чат или вызвал какую-либо команду. Все эти действия и являются рядом запросов, которые и формируют пакет данных и, в данном случае, передают их на сервер. Затем сервер обрабатывает эти самые пакеты, "распаковывая" поочередно каждый запрос. Например, игрок изменяет свое местоположение. Клиент формирует пакет, указывая, кто изменил, с какой позиции на какую, и еще некоторые данные. Далее этот пакет уходит по соответствующим каналам на сервер. Сервер, в свою очередь, распаковывает пакеты. Обработав всю информацию из пакетов, он формирует новый пакет, который уже рассылает всем другим игрокам. Так, они тоже получают информацию о том, что кто-то изменил свое местоположение.

 

3. Параметр пинг.

Несомненно, время отправки этих пакетов - миллисекунды. Причем стоит понимать, что другие игроки получают обновленную информацию только после того, как клиент, который как-то "обновился", отправит пакет на сервер, сервер его обработает, создаст новый, и отправит уже новый пакет другим пользователям. Интервал времени между изменением состояния игрока и получением этого изменения другими пользователями называется пингом. Многие о нем слышали, многие в окне TAB наблюдали за своим пингом и при большом пинге замечали "подтормаживания". Теперь Вы понимаете, почему высокий пинг есть плохо? Ведь пинг - это лишь интервал времени. И чем больше интервал времени, тем реже Вы получаете какую-либо информацию о других игроках. Соответственно, и тем реже другие игроки получают информацию о Вас.

 

yWELosJ4Yz2893PX7BCkhj-650-80.gif

 

Рассмотрим анимированное изображение. Здесь мы видим, что пакет данных от клиента до сервера доходит за 10 миллисекунд. За такой же промежуток времени пакет данных доходит от сервера до клиента. Сумма этих интервалов времени и есть пинг. В данной ситуации он составляет 20 миллисекунд. Причем обратите внимание на то, что устройство человека не позволяет отличить 10 миллисекунд ни от 50 миллисекунд, ни от 100 миллисекунд и порой даже ни от 500 миллисекунд. 

 

Иногда пинг бывает слишком высоким. Грубо говоря, который выглядит уже не как отрезок с началом и концом, а лучом - начало есть, а вот конца нет. Сейчас я рассматриваю ситуацию, когда по какой-либо причине связь между клиентом и сервером потеряна. Пакеты, не дошедшие до сервера (клиента), окажутся потерянными. А значит та информация, что должна была придти, не придет.

 

Спойлер

Допустим такую ситуацию, что игрок лечиться за деньги в больнице. В Вашем игровом моде есть следующий код:


GivePlayerMoney(playerid, -1000); // забираем у игрока 1000$ за лечение
SetPlayerHealth(playerid, 100.0); // вылечим игрока полностью

Казалось бы, участок кода как участок кода. Но давайте рассмотрим такую ситуацию. На сервер уходят пакеты, связанные с изменением количества средств и изменением количества здоровья. Но тут происходит так, что пакеты теряются (позже мы еще рассмотрим причины потери пакетов). Тут игрока кто-нибудь ударяет - отправляется прежний пакет на изменение здоровья и новый. В итоге: пакет, связанный с изменением денежных средств, не дошел, а пакет, связанный со здоровьем игрока, благополучно доходит. Дальше в ход вступает Ваш "чудесный" античит: он видит, что у игрока изменилось количество здоровья, но не изменилось количество средств. Назревает вопрос: а не пользуется ли игрок запрещенным программным обеспечением? Игрок благополучно получает наказание, по сути ни за что.

 

4. Параметр лаг.

Условия лагов - та самая ситуация, в которой пинг слишком велик. А значит время между отправкой и получения пакетов слишком большое. В таких условиях информация об изменениях "в игроке" обновляется у других не так часто, как должна. Так, если время между отправкой и получением пакетов составляет 5 секунд, то игрок, на стороне которого возникают проблемы, у других может появляться в разных концах комнаты, а отправленные им сообщения будут доходить не сразу (по мере отправки), а лишь каждые пять секунд (примерно). Так, мы будем наблюдать лишь конечное положение игрока, без промежуточных, то есть не увидим цепочку перемещений.

 

5. Причины лагов и высокого пинга.

 

p5ow3pMYhAM.jpg

 

(упрощенная схема маршрутизации. Несомненно, на практике она явно длиннее)

 

  • Маршрутизация. Пакет данных преодолевает большое расстояние, пока доходит до точки назначения — сервера (или клиента). Ведь провода интернета идут не напрямую к Вашему компьютеру, а через множество промежуточных пунктов, которые расположены не только в Вашем городе. И чем больше таких промежуточных пунктов и чем больше расстояние между клиентом и сервером, тем больше пинг. А значит и сильнее лаги.
  • Потеря пакетов. К сожалению, нередкие ситуации, когда пакеты данных теряются. Это может быть связано с проблемами локальной сети, проблемами в сетевом интерфейсе или драйверами, проблемами в сетевом порте или кабеле и, наконец, перегрузкой сети, линий электропередач (ЛЭП), проблемы с прошивкой роутера или низкая пропускная способность канала.

 

В случае, если все проблемы в прошивке роутера, пробуйте ее обновлять. Пробуйте "стучать" своему интернет-провайдеру, чтобы специалисты разрешили Ваши проблемы по данному вопросу (хотя никто не мешает отказаться от своего интернет-провайдера и перейти к другому). Либо же ждите, пока произойдет разгрузка сети (если, конечно, в ней источник проблем).

 

6. Лимит времени ответа.

Во всех многопользовательских online-игр есть некий лимит времени ответа. По большому счету это время, за которое должен поступить какой-нибудь пакет от клиента. Если же в течение этого времени не было получено ни одного пакета, теряется соединение между сервером и игроком. И тут, в случае с Grand Theft Auto, игрок видит строку в чате: «Подключение к серверу невозможно. Переподключение…».

 

Автор статьи: @odosenok

Отдельные предложения и изображения были позаимствованы с различных интернет-ресурсов.

 

Share this post


Link to post
Share on other sites

Your content will need to be approved by a moderator

Guest
You are commenting as a guest. If you have an account, please sign in.
Reply to this topic...

×   You have pasted content with formatting.   Remove formatting

  Only 75 emoticons maximum are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

Loading...
Sign in to follow this  
Followers 0

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • SANTY MONTANO
      By SANTY MONTANO
      WIDEHOST.RU
      Бюджетный игровой хостинг, который предоставляет выгодные тарифы на аренду серверов:
      SAMP, CRMP, MTA и MINECRAFT.
      До "лучшего" как все свои расхваливают, нам еще далеко.
      Кругом одни "лучшие" игровые хостинги от которых сбегают люди и приходят на простенькие и радуются.
      Как мне кажется, все игровые хостинги сами по себе одинаковые, а отличие их только в обслуживании, которое предоставляет команда.
      Мы проработали какие-то 3 месяца, а уже имеются положительные отзывы и запущено более 30 серверов.
      Итак, начнем...
      - Стоит защита от DDoS атак
      - Хорошая техническая поддержка, которая поможет и решит любую проблему бесплатно
      - Удобная панель управления серверами
      - Бесплатная автоустановка модификаций
      - Имеется Firewall, который ограничивает доступ по определенному ip адресу человека
      - Частые розыгрыши для наших клиентов
      Тарифы:
      SAMP/CRMP - 0.50 рублей - 1 слот
      MTA - 2 рубля - 1 слот
      MINECRAFT - 50 рублей - неогран. слоты
      Так же есть тарифы, которые в 2 раза дешевле*
      Сайт: widehost.ru
      Группа: vk.com/widehostru

    • pak2001
      By pak2001
      Всем привет. Решил создать свой проект, нанял скриптера, мапера. Они все делают идеально, но у меня возникли проблемы. а именно не я, не они не знают как установить сборку сервера. У нас она есть, но мы не знаем куда ее устанавливать. Кто знает, помогите . Еще такой вопрос, у нас есть лаунчер, как в нем настроить, так чтобы при выборе пути установки сборки, и нажатия на кнопку установить, автоматически устанавливался и самп и крмп и сборка, и не надо было сначала отдельно скачивать саму ГТА, потом самп, крмп, сборку. А сделать так, чтобы все сразу автоматически устанавливалось в одну паку.
      Сори за ошибки и безграмотность изложения моего вопроса.
    • odosenok
      By odosenok
      Эта тема создана автоматически для возможности комментирования статьи Disable Name Tag Los RU (русифицированный выпуск) Автор статьи: @odosenok
      Статья опубликована: 03.08.2017 14:55
       
       
       
      Просмотреть полную запись
       
       
       
    • Guest
      By Guest
      Эта функция была добавлена в версии  0.3a и не будет работать в более ранних версиях!
       
      ОПИСАНИЕ: Функция позволяет включить отображение ников через стены. Наподобие WallHack'a.
      ПАРАМЕТРЫ ФУНКЦИИ: Функция не имеет параметров.
      ВОЗВРАЩАЕМЫЕ ФУНКЦИЕЙ ЗНАЧЕНИЯ:
      Функция не возвращает никаких значений.
      ПРИМЕР ИСПОЛЬЗОВАНИЯ:
      public OnGameModeInit() { DisableNameTagLOS(); return 1; }