Перейти к содержанию

Коррекция пинга


Арзамас

Рекомендуемые сообщения

Статья носит исключительно информативный характер, для того что-бы вы знали как работает связка клиент-сервер, почему "лагает" когда много народа и почему получаешь урон уже спрятавшись в укрытиях.

 

Что такое PING и с чем его едят?


"Решил я поиграть в Counter-Strike: Source, дабы посмотреть и понять принцип работы самой игры и, по возможности, отыскать фишки, которые неплохо было бы знать при игре в Counter-Strike: Source. И привело это к тому, что я их нашел. Некоторые из них сложные, некоторые легкие, некоторые интересные, но большинство скучные =).

Ниже описаны три ситуации, которые я сейчас поясню.
Вы выходите из-за угла стены/ящика и тут же быстро уходите назад. Вы не видите врага, но при этом получаете повреждения.
Вы выбегаете из-за угла на врага, высаживаете в него всю обойму и умираете. После чего открываете консоль и видите, что попали в него всего дважды, не смотря на то, что выпустили в него всю обойму в упор.
Вы стреляетесь с врагом, попадаете - видите, что на его теле и вокруг есть кровь, но в итоге попадание не были зарегистрированы и враг не получил ни одного повреждения.
Я потратил на тесты около недели, чтобы понять, почему случаются такие ситуации и являются ли они ошибками Valve. Описанные ниже заключения и наблюдения, к которым я пришел на протяжении недельного теста игры, я постараюсь изложить в максимально доступной форме для обыкновенного читателя.

Итак, для начала несколько определений:
Latency (ping) – пинг - временной промежуток, за который пакет, отосланный от вашего компьютера проходит до сервера (и наоборот). В миллисекундах
Server - Сервер – Выделенный сервер в Интернете, расположенный на каком-нибудь компьютере.
Client Клиент – Игра, запущенная на вашем компьютере. Клиент подключается к Серверу. На сервере может выставляться количество возможных подключаемых клиентов.
Shot Trajectory - Траектория выстрела – Линия между концом дула вашего оружия и местом, куда попала ваша пуля.
Hitbox – Хитбокс – модели игроков в Counter-Strike: Source поделены на так называемые Хитбоксы (hitboxes), которые блокируют различные участки моделей. В одной моделе существует множество хитбоксов . Если выстрелить в хитбокс, то значение здоровья и броняи игрока уменьшается.

CS:Source – Основы
В абсолютно любом сетевом 3D шутере, главной проблемой, которую решают в первую очередь, является пинг. Каждый игрок должен видеть тоже что видят и его соперники. Соперники же должны двигаться плавно, без рывков и задержек – ведь на самом деле игра обновляется периодически, а время между отправкой и получением пакета порой может быть очень длинным промежутком.

Немного информации
На карте Ваша позиция у Вас на мониторе относительно вас же на сервере и вас же на экранах других клиентов никогда не будет одинаковой. Это происходит по причине задержки, из-за того, что Ваш компьютер отсылает серверу пакет с информацией о Вашем местоположении, сервер симулирует как бы кадр игры, обновляет у себя о Вас информацию, после чего отправляет информацию о Вас другим клиентам, а они получают и обновляют уже о Вас информацию у себя. Эта проблема в связке с тем, что у вас на экране все выглядит плавно, составляет неприятную картину. 
http://exclan.clan.su/ForNews/PingFAQ/1.png

Такая картина иногда видна в самой игре, зачастую приводя к недоумению игроков.
1 Ситуация «Слайдшоу из хитбоксов»:
«Вы выходите из-за угла стены/ящика и тут же быстро уходите назад. Вы не видите врага ,но при этом вы получаете повреждение.»

Объяснение:
Чтобы объяснить причину такого поведения игры, мы должны принять во внимание все, что происходит на Вашем компьютере, на компьютере сервера и на компьютерах других игроков.
Вещи, о которых Вам надо знать, перед тем, как я продолжу
Фактические повреждения (ну или расположения хитбоксов, если так понятнее) просчитываются на стороне сервера. Но на стороне клиента также отслеживается положение хитбоксов, но чисто для визуализации (скажем, искры от пуль при поподании в броню, брызги крови из тела и тд.), но об этом мы подробнее поговорим, когда дойдем до третьей ситуации.
В идеале обмен пакетами происходит в течении 30 миллисекунд. Это то время за которое сервер успевает обновить информацию о Вас, а Вы – о сервере. Но на практике эта цифра в разы больше, судя по пингу.
Время, которое тратится клиентом и сервером на обработку полученной информации столь мало, что его даже не имеет смысла брать во внимание.
Проблема в данной ситуации наблюдается в случае, если происходит так называемая «коррекция задержек (лагов)», которая встроена в движок Source. Чтобы полностью понять, зачем это нужно, для начала мы посмотрим, что происходит с игрой, если нет никакой корректировки лагов.

0 миллисекунда (Сцена 1)
Игрок 1: резко выходит из-за угла, видит Игрока 2, который находится в неподвижном состоянии.
Сервер: Ничего не происходит (Пакет не успел еще дойти)
Игрок 2: Стоит и никого не наблюдает

30 миллисекунд (Сцена 2)
Игрок 1: Уходит обратно в укрытие.
Сервер: получает пакет с информацией из Сцены 1 о том, что Игрок 1 вышел из-за своего укрытия и отправляет эту информацию Игроку 2.
Игрок 2: Ничего не происходит (помните? Пакет идет 30 миллисекунд, как от игрока до сервера, так и наоборот).

60 миллисекунд (Сцена 3)
Игрок 1: у себя на компьютере он спрятался в своем укрытии.
Сервер: Получает пакет из Ситуации 3 с информацией о том, что Игрок 1 находится опять за укрытием (так что данные сервера и Игрока 1 синхронизированы)
Игрок 2: Получает пакет с Ситуацией 1, видит Игрока 1, стреляет по нему, но естественно стреляет по пустому месту, так как игрок уже как 60 миллисекунд назад оказался опять в своем укрытии.

Давайте для наглядности рассмотрим такую визуальную схему

Ну и получается в итоге следующая картина: Сервер получает информацию о выстрелах Игрока 2 по Игроку 1, в то время как Игрок 1 находится уже совсем в другом месте, следовательно, повреждения от выстрелов не учитываются. Это не очень-то справедливо, по отношению к Игроку 2, так как он-то как раз видит в это время Игрока 1.

И вполне резонный вопрос возникает: как решать эту проблему? Движок Source делает следующее. А именно программа просчитывает траекторию выстрела Игрока 2 и переносит ее так, как будто он стрелял в реального Игрока 1, независимо от того, где последний находится сейчас.
Сервер высчитывает идеальное значение переноса траекторий выстрелов, основываясь на пинге всех игроков.

http://exclan.clan.su/ForNews/PingFAQ/2.png

На картинке: красный хитбокс показывает нам, где находился клиент, когда я стрелял по нему. Синий же показывает, где находился клиент на сервере, когда тот (сервер) получил информацию о моих выстрелах . Обратите внимание на красный цельный кубик в красном хитбоксе. Это то место, куда попал мой выстрел у меня на клиенте. Синий же кубик в синем хитбоксе – это же место положения попадания от моего выстрела, но с поправкой на мой пинг. Но не исключено, что траектория выстрела на мониторах других игроков так и осталась старой. Сбивает с толку!

Теперь рассмотрим Сцены с «коррекцией Пинга»
0 миллисекунд (Сцена 1)
Игрок 1: резко выходит из-за угла, видит игрока 2, который находится в неподвижном состоянии.
Сервер: Ничего не происходит (Пакет не успел дойти)
Игрок 2: Стоит и никого не наблюдает

30 миллисекунд (Сцена 2)
Игрок 1: уходит обратно в укрытие
Сервер: получает пакет с информацией о сцене 1, Игрок 1 на открытом пространстве, но еще никто об этом не знает.
Игрок 2: Стоит и никого не наблюдает

60 миллисекунд (Сцена 3)
Игрок 1: спрятался
Сервер: получает пакет с информацией о сцене 2 (то есть сервер синхронизируется с клиентом 1: и там и там игрок 1 сидит в укрытии)
Игрок 2: Игрок 2 получает пакет с информацией о Сцене 1, видит Игрока 1, стреляет по нему. Но при получении информации о выстрелах, сервер делает коррекцию относительно пинга Игрока 2 и отнимает здоровье у Игрока 1, который в это время уже, как мы сказали, находится в укрытии. Игрок 1 в недоумении.

Теперь ситуация становится более справедливой, несмотря на то что, Игрок 1 находился уже в укрытии, Игрок 2, заметив его, выстрелил, тем самым сервер насчитал первому повреждения. Проблема только в том, что Первый игрок получает повреждения уже после того, как высунулся, то есть уже в укрытии и по этому скорее всего он напишет что-то знакомое всем типа «как меня достали эти лаги!» =). Итак, «корректировка лагов» заключается в том, что у Игрока 2 появляется возможность наносить повреждения Игроку 1 не обращая внимания на задержки между тем, пока движется Игрок 1 и тем пока его не заметит Игрок 2. Неплохое начало.

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

Взглянем на эти скриншоты (полученные благодаря sv_showimpacts 1). На них показана разница между позициями игрока на сервере (синий хитбокс) и на клиенте (красный), и траектория выстрела, которая показана красным и синим кубиком. Обратим внимание – сервер откорректировал траекторию выстрела относительно врага. 

http://exclan.clan.su/ForNews/PingFAQ/3.png

2 Ситуация «Что за бред! Я в него выпустил всю обойму!»:
«Вы выбегаете из-за угла на врага, высаживаете в него всю обойму и умираете. После чего открываете консоль и видите, что попали в него всего дважды, не смотря на то, что выпустили в него всю обойму в упор.»

Объяснение:
Такая ситуация происходит (аналогично первому примеру) из-за задержки между вещами, происходящими на сервере и вашим компьютером.

Главная вещь, которую следует понять, это то, что вещи, которые происходят на сервере, происходят раньше, чем у вас на компьютере – вашем клиенте. Для облегчения понимания ситуации, условимся, что на обоих клиентах лаги (пинг) одинаковые, так что не надо утруждаться и высчитывать коррекцию между двумя машинами.

Итак, когда Игрок 1 подходит к углу, то оба клиента (и Игрок 1 и Игрок 2) знают об этом, тут нет задержек, у обоих синхронизированная информация. Выходя, оба начинают стрелять. Теперь, из-за задержки (идет обмен информацией о выстрелах) каждому, чтобы увидеть другого стреляющего клиента, потребуется 60 миллисекунд (вспомните первую ситуацию, так же и для отсылки повреждений. Это значит, что за время пока дет обмен этой информацией, вы сможете выстрелять кучу патронов. И если Ваш оппонент начал стрелять на какую-то долю секунды раньше Вас (или даже если раньше, но он попал Вам, скажем, в голову), и Вы уже возможно мертвы, но Ваш клиент не знает еще пока об этом, ведь для этого надо 60 миллисекунд с момента как Вы увидели врага! В итоге сервер просто игнорирует все Ваши выстрелы, выпущенные до момента пока Вас не убили, и убивает Вас. А у Вас создается иллюзия, что Вы выпустили целую обойму, перед тем как Вас убили.
3 Ситуация «Холостой выстрел!»:
«Вы стреляетесь с врагом, попадаете - видите, что на его теле и вокруг есть кровь, но в итоге попадание не были зарегистрированы и враг не получил ни одного повреждения.»

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

Взглянем на скриншот и посмотрим, и убедимся в том, что модели на сервере и на клиенте находятся и, правда, в различных позах.

http://exclan.clan.su/ForNews/PingFAQ/4.png

Отметим, что разница между позициями ног на сервере и клиенте существенно велика (сервер – синий хитбокс, клиент - красный). Выстрел, который сделал игрок, отмечен красной буквой «А», он не будет зарегистрирован на сервере, так как там эта же нога находится в другом месте. Но игрок будет уверен, что попал по врагу.

А вот типичный пример, когда попадание не регистрируется сервером – я стреляю в край рюкзака (который естественно имеет разные положения как на сервере так и у меня на мониторе), и синий бокс оказался на стене позади, поскольку сервер не регистрировал ранение. 

http://exclan.clan.su/ForNews/PingFAQ/5.png

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

На 16 местном сервере получится следующее:
16х15=240 позиций моделей, которые надо обработать, просчитать и протестировать на попадания, все ли модели были в зонах попадания или нет, и зарегистрировать и отсечь попадания и промахи (в худшем случае).

Таким образом подобная задачу просто нереально просчитать.

Но не стоит забывать, что бывают и также обратные ситуации (вы промахиваетесь у себя на компьютере, но сервер засчитывает вам попадание), таким образом стрельба выравнивается.
Итого:
sv_showimpacts – серверная команда, позволяющая увидеть точные попадания во врага, как на сервере, так и на клиенте. Она, кстати, так же позволяет смотреть, какое оружие, какие поверхности и стены пробивает. Посмотреть точность, аккуратность, разброс и силу пуль.
Руки и ноги самые тяжело попадаемые места, из-за их постоянной подвижности. То есть, как было сказано выше, на сервере и клиенте практически всегда они имеют разную позицию (регистрируется всего около 70% попаданий), та же ситуация и с головой.
Брызги крови – исключительно клиентская часть, и это вовсе не показатель того, сколько раз Вы попали в игрока. Но, кровь, которая остается на стенах и полу – серверная часть, по ней можно как раз судить о зарегистрированных попаданиях. Искры от бронежилета так же не показатель попадания. Высокий пинг (до поры пока не начнется потеря пакетов и choke) особо не влияет на Вашу игру из-за корректировки лагов. Предел я вам не могу точно назвать (может 100-150), так как протестировать игру на высокий пинг не было возможности. "


http://sz-klan.moy.su

Статью написал MacMan

Изменено пользователем Арзамас
Ссылка на комментарий
Поделиться на другие сайты

Я дико извиняюсь. Уточните пожалуйста.
 
Итог, сама статья, слова "Статья носит исключительно информативный характер, для того что-бы вы знали как работает связка клиент-сервер, почему "лагает" когда много народа и почему получаешь урон уже спрятавшись в укрытиях." каким образом относятся к Bless?

 

Возможно спасибо за старания, но может не стоит забивать базу знаний по Bless, лишней информацией?

Или если просунуть эту тему по всем проектам Бандитов в Базы знаний, можно срубить плюсов?

Изменено пользователем Wersal
Ссылка на комментарий
Поделиться на другие сайты

К тому что все сервера игровые работают одинаково. Спасибо что похоронили тему.

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

Изменено пользователем Арзамас
Ссылка на комментарий
Поделиться на другие сайты

@Арзамас, тут не в плюсах дело, а в том что это общая тема, не относящаяся лишь к Bless. И почему ты решил её создать в ветке Bless, не понятно. Это же не помойка.

Изменено пользователем Wersal
Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • Mayron
    • Mayron
    • Mayron
    • Mayron
      Работаю учителем математики в школе и репетитором. В школе примерно четверть времени идет на всякую фигню, типа бумаг, и нафиг не нужных отчетов, при этом часовая зарплата в 4 раза меньше, чем за репетиторство. То есть, если я вместо отчетов буду заниматься репетиторством, а вместо работы в школе буду проводить занятия в группе бесплатно, то ни я, ни дети ничего не потеряют. Только система пойдет лесом. Только жалко взрослых. Они платят налоги, а на них придумывают глупости, которые мешают работать.
    • McWolf
      если у кого будут ключи приглашения, не откажусь, спасибо)
    • McWolf
      Soulframe — кооперативная компьютерная видеоигра в жанрах гибридная-MMORPG и Фэнтези, разрабатываемая канадской студией Digital Extremes, под руководством Джеффа Крукса и Стива Синклера, ранее работавшие над «Warframe» и «Dark Sector». Действие игры происходит в вымышленном фентезийном мире, где игроку предстоит взять на себя роль Посланника — существа, чья фракция обладает неординарными способностями. Видеоигра была анонсирована на ежегодном мероприятии «TennoCon 2022», где сотрудники Digital Extremes анонсируют и делятся некоторыми деталями о последующих обновлениях «Warframe». После показа первого трейлера «Soulframe», Стив Синклер, сценарист и «лоровед» игры, заявил о том, что некоторые старые сотрудники компании перейдут с работы над «Warframe», к работе над «Soulframe», давая больший размах для новых и будущих сотрудников. Точная дата выхода игры неизвестна Мир Soulframe, как предполагается, может быть его самым интересным персонажем. Игра будет посвящена темам природы, восстановления и приключениям, вдохновленным такими произведениями, как «Принцесса Мононоке» и «Бесконечная история», в частности, столкновению между промышленностью и планетой. Джефф Крукс Основным противостоянием в игре будет не борьба определённых фракции за контроль над территориями, а борьба существ и промышленности с самим фентезийном миром игры, который под влиянием ранее упомянутых будет серьёзно изменятся в своих самых разнообразных аспектах. Как утверждает[2] сам Джефф Крукс, творческий директор «Soulframe», одним из основных аспектов игры будет то, что сам мир будет «слегка» зол на то, что с ним сделали, и что это впоследствии будет серьёзно влиять на внутриигровой процесс. Там, где Warframe сосредоточена на стрельбе, эта сосредоточена на ближнем бою. Там, где Warframe супербыстрая, эта будет намного медленнее и тяжелее. Но Soulframe будет иметь много общего с жанром, в котором у нас есть опыт. Стив Синклер В отличие от предыдущего проекта компании, «Soulframe» будет иметь более проработанную и детализированную концепцию, которая в значительной степени будет представлять собой зеркальную версию вселенной «Warframe». Несмотря на подобные заявления со стороны разработчиков, последние не собираются создавать клон своего успешного проекта. Но и не собираются полностью забывать «Warframe», так как «Soulframe» будет являться лишь чем-то похожим на него. Я гонюсь за этим «коротким сеансом, но с высоким уровнем погружения». Когда вы после логина в игру и появления в привычном месте понимаете, что мир живет и без вас. Джефф Крукс Предыдущая игра Digital Extremes требовала от игроков слишком много времени и внимания, если они хотели что-либо получить или соорудить. Вследствие данного факта некоторые игроки прекращали получать хоть какое-то удовольствие или эмоции от игры, рано или поздно переставая проводить в ней своё личное время. В «Soulframe» планируется иная атмосфера, которая даже за короткие сеансы игры сможет развлечь игрока.
    • Mayron
      Женщины зря развивают в себе комплексы, думая, что они будут не нужны после 25...после 35...после 45... Они нужны в любом возрасте ...но есть один нюанс: ебанутые женщины не нужны ни в каком возрасте.
    • Mayron
    • Mayron
    • Mayron
×
×
  • Создать...