Новые сообщения · Участники · Правила форума · Поиск · RSS |
|
|
Модератор форума: ad1k |
MASoft Форум » Всё для Cs » Советы » Что такое PING и с чем его едят? (Многа букаф!) |
Что такое PING и с чем его едят? |
Решил я поиграть в Counter-Strike: Source, дабы посмотреть и понять принцип работы самой игры и, по возможности, отыскать фишки, которые неплохо было бы знать при игре в Counter-Strike: Source. И привело это к тому, что я их нашел. Некоторые из них сложные, некоторые легкие, некоторые интересные, но большинство скучные =).
Ниже описаны три ситуации, которые я сейчас поясню. Вы выходите из-за угла стены/ящика и тут же быстро уходите назад. Вы не видите врага, но при этом получаете повреждения. Вы выбегаете из-за угла на врага, высаживаете в него всю обойму и умираете. После чего открываете консоль и видите, что попали в него всего дважды, не смотря на то, что выпустили в него всю обойму в упор. Вы стреляетесь с врагом, попадаете - видите, что на его теле и вокруг есть кровь, но в итоге попадание не были зарегистрированы и враг не получил ни одного повреждения. Я потратил на тесты около недели, чтобы понять, почему случаются такие ситуации и являются ли они ошибками Valve. Описанные ниже заключения и наблюдения, к которым я пришел на протяжении недельного теста игры, я постараюсь изложить в максимально доступной форме для обыкновенного читателя. Итак, для начала несколько определений: CS:Source – Основы Немного информации Такая картина иногда видна в самой игре, зачастую приводя к недоумению игроков. Объяснение: 0 миллисекунда (Сцена 1) 30 миллисекунд (Сцена 2) 60 миллисекунд (Сцена 3) Давайте для наглядности рассмотрим такую визуальную схему Ну и получается в итоге следующая картина: Сервер получает информацию о выстрелах Игрока 2 по Игроку 1, в то время как Игрок 1 находится уже совсем в другом месте, следовательно, повреждения от выстрелов не учитываются. Это не очень-то справедливо, по отношению к Игроку 2, так как он-то как раз видит в это время Игрока 1. И вполне резонный вопрос возникает: как решать эту проблему? Движок Source делает следующее. А именно программа просчитывает траекторию выстрела Игрока 2 и переносит ее так, как будто он стрелял в реального Игрока 1, независимо от того, где последний находится сейчас. На картинке: красный хитбокс показывает нам, где находился клиент, когда я стрелял по нему. Синий же показывает, где находился клиент на сервере, когда тот (сервер) получил информацию о моих выстрелах . Обратите внимание на красный цельный кубик в красном хитбоксе. Это то место, куда попал мой выстрел у меня на клиенте. Синий же кубик в синем хитбоксе – это же место положения попадания от моего выстрела, но с поправкой на мой пинг. Но не исключено, что траектория выстрела на мониторах других игроков так и осталась старой. Сбивает с толку! Теперь рассмотрим Сцены с «коррекцией Пинга» 30 миллисекунд (Сцена 2) 60 миллисекунд (Сцена 3) Теперь ситуация становится более справедливой, несмотря на то что, Игрок 1 находился уже в укрытии, Игрок 2, заметив его, выстрелил, тем самым сервер насчитал первому повреждения. Проблема только в том, что Первый игрок получает повреждения уже после того, как высунулся, то есть уже в укрытии и по этому скорее всего он напишет что-то знакомое всем типа «как меня достали эти лаги!» =). Итак, «корректировка лагов» заключается в том, что у Игрока 2 появляется возможность наносить повреждения Игроку 1 не обращая внимания на задержки между тем, пока движется Игрок 1 и тем пока его не заметит Игрок 2. Неплохое начало. Другая польза от коррекции лагов заключается в том, что теперь вам не надо вести прицел за целью, чтобы попасть по ней, и когда два игрока встречаются нос к носу, то игрок с более низким пингом не получает приемуществ. Взглянем на эти скриншоты (полученные благодаря sv_showimpacts 1). На них показана разница между позициями игрока на сервере (синий хитбокс) и на клиенте (красный), и траектория выстрела, которая показана красным и синим кубиком. Обратим внимание – сервер откорректировал траекторию выстрела относительно врага. 2 Ситуация «Что за бред! Я в него выпустил всю обойму!»: Объяснение: Главная вещь, которую следует понять, это то, что вещи, которые происходят на сервере, происходят раньше, чем у вас на компьютере – вашем клиенте. Для облегчения понимания ситуации, условимся, что на обоих клиентах лаги (пинг) одинаковые, так что не надо утруждаться и высчитывать коррекцию между двумя машинами. Итак, когда Игрок 1 подходит к углу, то оба клиента (и Игрок 1 и Игрок 2) знают об этом, тут нет задержек, у обоих синхронизированная информация. Выходя, оба начинают стрелять. Теперь, из-за задержки (идет обмен информацией о выстрелах) каждому, чтобы увидеть другого стреляющего клиента, потребуется 60 миллисекунд (вспомните первую ситуацию, так же и для отсылки повреждений. Это значит, что за время пока дет обмен этой информацией, вы сможете выстрелять кучу патронов. И если Ваш оппонент начал стрелять на какую-то долю секунды раньше Вас (или даже если раньше, но он попал Вам, скажем, в голову), и Вы уже возможно мертвы, но Ваш клиент не знает еще пока об этом, ведь для этого надо 60 миллисекунд с момента как Вы увидели врага! В итоге сервер просто игнорирует все Ваши выстрелы, выпущенные до момента пока Вас не убили, и убивает Вас. А у Вас создается иллюзия, что Вы выпустили целую обойму, перед тем как Вас убили. Давайте теперь разберем, как сервер транслирует наш выстрел на новую траекторию с учетом корректировки. Как известно, сервер обрабатывает не только все объекты на карте, позиции моделей, но и так же анимацию моделей (бег, ходьба и проч.). Когда Вы стреляете, выстрел транслируется на сервере, тестируется на степень повреждения, независимо от того, в какой позе была модель. Потому что из-за задержек модель на сервере и модель на клиенте очень редко бывают в одинаковых позициях. Например, анимации очень редко бывают в одном кадре, и получается, что каждая поза в одно и тоже время находится в немного разных точках. Самая подвижная анимация это бег и стрейфы. Качание головы, рук и ног – все в движении. Получается, что если Вы стреляете в плечо, Ваш выстрел транслируется на сервер, где модель, в которую Вы выстреливали, может уже находиться в другой позе, например, голова повернута в другую сторону, нога перенесена и тд. Взглянем на скриншот и посмотрим, и убедимся в том, что модели на сервере и на клиенте находятся и, правда, в различных позах. Отметим, что разница между позициями ног на сервере и клиенте существенно велика (сервер – синий хитбокс, клиент - красный). Выстрел, который сделал игрок, отмечен красной буквой «А», он не будет зарегистрирован на сервере, так как там эта же нога находится в другом месте. Но игрок будет уверен, что попал по врагу. А вот типичный пример, когда попадание не регистрируется сервером – я стреляю в край рюкзака (который естественно имеет разные положения как на сервере так и у меня на мониторе), и синий бокс оказался на стене позади, поскольку сервер не регистрировал ранение. Но это не баг, а необходимый, легко реализуемый путь, который пришлось использовать для увеличения производительности. Чтобы проверять все выстрелы по одной определенной модели, учитывая все ее положения за каждый определенный кусок времени, серверу придется следить или просчитывать все задержки моделей для каждого игрока на сервере. На 16 местном сервере получится следующее: Таким образом подобная задачу просто нереально просчитать. Но не стоит забывать, что бывают и также обратные ситуации (вы промахиваетесь у себя на компьютере, но сервер засчитывает вам попадание), таким образом стрельба выравнивается. Поставь в репутации +1 небудь жмотярой! По вашим просьбам залью на другой любой фаилообменник! |
| |||
| |||