Решил я поиграть в Counter-Strike: Source, дабы посмотреть и понятьпринцип работы самой игры и, по возможности, отыскать фишки, которыенеплохо было бы знать при игре в Counter-Strike: Source. И привело эток тому, что я их нашел. Некоторые из них сложные, некоторые легкие,некоторые интересные, но большинство скучные =).
Ниже описаны три ситуации, которые я сейчас поясню.- Вы выходите из-за угла стены/ящика и тут же быстро уходите назад. Вы не видите врага, но при этом получаете повреждения.
- Вы выбегаете из-за угла на врага, высаживаете в него всю обойму иумираете. После чего открываете консоль и видите, что попали в неговсего дважды, не смотря на то, что выпустили в него всю обойму в упор.
- Вы стреляетесь с врагом, попадаете - видите, что на его теле ивокруг есть кровь, но в итоге попадание не были зарегистрированы и врагне получил ни одного повреждения.
Я потратил на тесты около недели, чтобы понять, почему случаются такиеситуации и являются ли они ошибками Valve. Описанные ниже заключения инаблюдения, к которым я пришел на протяжении недельного теста игры, япостараюсь изложить в максимально доступной форме для обыкновенногочитателя.
Итак, для начала несколько определений: Latency (ping) – пинг - временной промежуток, за который пакет, отосланный от вашего компьютера проходит до сервера (и наоборот). В миллисекундах Server - Сервер – Выделенный сервер в Интернете, расположенный на каком-нибудь компьютере. Client Клиент – Игра, запущенная на вашем компьютере. Клиентподключается к Серверу. На сервере может выставляться количествовозможных подключаемых клиентов. Shot Trajectory - Траектория выстрела – Линия между концом дула вашего оружия и местом, куда попала ваша пуля. Hitbox – Хитбокс – модели игроков в Counter-Strike: Sourceподелены на так называемые Хитбоксы (hitboxes), которые блокируютразличные участки моделей. В одной моделе существует множествохитбоксов . Если выстрелить в хитбокс, то значение здоровья и броняиигрока уменьшается.
CS:Source – Основы В абсолютно любом сетевом 3D шутере, главной проблемой, которую решаютв первую очередь, является пинг. Каждый игрок должен видеть тоже чтовидят и его соперники. Соперники же должны двигаться плавно, без рывкови задержек – ведь на самом деле игра обновляется периодически, а времямежду отправкой и получением пакета порой может быть очень длиннымпромежутком.
Немного информации На карте Ваша позиция у Вас на мониторе относительно вас же на сервереи вас же на экранах других клиентов никогда не будет одинаковой. Этопроисходит по причине задержки, из-за того, что Ваш компьютер отсылаетсерверу пакет с информацией о Вашем местоположении, сервер симулируеткак бы кадр игры, обновляет у себя о Вас информацию, после чегоотправляет информацию о Вас другим клиентам, а они получают и обновляютуже о Вас информацию у себя. Эта проблема в связке с тем, что у вас наэкране все выглядит плавно, составляет неприятную картину. Такая картина иногда видна в самой игре, зачастую приводя к недоумению игроков. 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, независимо от того, где последний находится сейчас. Сервер высчитывает идеальное значение переноса траекторий выстрелов, основываясь на пинге всех игроков. На картинке: красный хитбокс показывает нам, где находился клиент,когда я стрелял по нему. Синий же показывает, где находился клиент насервере, когда тот (сервер) получил информацию о моих выстрелах .Обратите внимание на красный цельный кубик в красном хитбоксе. Это томесто, куда попал мой выстрел у меня на клиенте. Синий же кубик в синемхитбоксе – это же место положения попадания от моего выстрела, но споправкой на мой пинг. Но не исключено, что траектория выстрела намониторах других игроков так и осталась старой. Сбивает с толку!
Теперь рассмотрим Сцены с «коррекцией Пинга» 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). Наних показана разница между позициями игрока на сервере (синий хитбокс)и на клиенте (красный), и траектория выстрела, которая показана красными синим кубиком. Обратим внимание – сервер откорректировал траекториювыстрела относительно врага.  2 Ситуация «Что за бред! Я в него выпустил всю обойму!»:«Вывыбегаете из-за угла на врага, высаживаете в него всю обойму иумираете. После чего открываете консоль и видите, что попали в неговсего дважды, не смотря на то, что выпустили в него всю обойму в упор.»
Объяснение: Такая ситуация происходит (аналогично первому примеру) из-за задержкимежду вещами, происходящими на сервере и вашим компьютером.
Главная вещь, которую следует понять, это то, что вещи, которыепроисходят на сервере, происходят раньше, чем у вас на компьютере –вашем клиенте. Для облегчения понимания ситуации, условимся, что наобоих клиентах лаги (пинг) одинаковые, так что не надо утруждаться ивысчитывать коррекцию между двумя машинами.
Итак, когда Игрок 1 подходит к углу, то оба клиента (и Игрок 1 и Игрок2) знают об этом, тут нет задержек, у обоих синхронизированнаяинформация. Выходя, оба начинают стрелять. Теперь, из-за задержки (идетобмен информацией о выстрелах) каждому, чтобы увидеть другогостреляющего клиента, потребуется 60 миллисекунд (вспомните первуюситуацию, так же и для отсылки повреждений. Это значит, что за времяпока дет обмен этой информацией, вы сможете выстрелять кучу патронов. Иесли Ваш оппонент начал стрелять на какую-то долю секунды раньше Вас(или даже если раньше, но он попал Вам, скажем, в голову), и Вы ужевозможно мертвы, но Ваш клиент не знает еще пока об этом, ведь дляэтого надо 60 миллисекунд с момента как Вы увидели врага! В итогесервер просто игнорирует все Ваши выстрелы, выпущенные до момента покаВас не убили, и убивает Вас. А у Вас создается иллюзия, что Вывыпустили целую обойму, перед тем как Вас убили. 3 Ситуация «Холостой выстрел!»:«Вы стреляетесь с врагом,попадаете - видите, что на его теле и вокруг есть кровь, но в итогепопадание не были зарегистрированы и враг не получил ни одногоповреждения.»
Давайте теперь разберем, как сервер транслирует наш выстрел на новуютраекторию с учетом корректировки. Как известно, сервер обрабатывает нетолько все объекты на карте, позиции моделей, но и так же анимациюмоделей (бег, ходьба и проч.). Когда Вы стреляете, выстрелтранслируется на сервере, тестируется на степень повреждения,независимо от того, в какой позе была модель. Потому что из-за задержекмодель на сервере и модель на клиенте очень редко бывают в одинаковыхпозициях. Например, анимации очень редко бывают в одном кадре, иполучается, что каждая поза в одно и тоже время находится в немногоразных точках. Самая подвижная анимация это бег и стрейфы. Качаниеголовы, рук и ног – все в движении. Получается, что если Вы стреляете вплечо, Ваш выстрел транслируется на сервер, где модель, в которую Вывыстреливали, может уже находиться в другой позе, например, головаповернута в другую сторону, нога перенесена и тд.
Взглянем на скриншот и посмотрим, и убедимся в том, что модели на сервере и на клиенте находятся и, правда, в различных позах. Отметим, что разница между позициями ног на сервере и клиентесущественно велика (сервер – синий хитбокс, клиент - красный). Выстрел,который сделал игрок, отмечен красной буквой «А», он не будетзарегистрирован на сервере, так как там эта же нога находится в другомместе. Но игрок будет уверен, что попал по врагу.
А вот типичный пример, когда попадание не регистрируется сервером – ястреляю в край рюкзака (который естественно имеет разные положения какна сервере так и у меня на мониторе), и синий бокс оказался на стенепозади, поскольку сервер не регистрировал ранение. Ноэто не баг, а необходимый, легко реализуемый путь, который пришлосьиспользовать для увеличения производительности. Чтобы проверять всевыстрелы по одной определенной модели, учитывая все ее положения закаждый определенный кусок времени, серверу придется следить илипросчитывать все задержки моделей для каждого игрока на сервере.
На 16 местном сервере получится следующее: 16х15=240 позиций моделей, которые надо обработать, просчитать ипротестировать на попадания, все ли модели были в зонах попадания илинет, и зарегистрировать и отсечь попадания и промахи (в худшем случае).
Таким образом подобная задачу просто нереально просчитать.
Но не стоит забывать, что бывают и также обратные ситуации (выпромахиваетесь у себя на компьютере, но сервер засчитывает вампопадание), таким образом стрельба выравнивается. Итого:- sv_showimpacts – серверная команда, позволяющая увидеть точныепопадания во врага, как на сервере, так и на клиенте. Она, кстати, также позволяет смотреть, какое оружие, какие поверхности и стеныпробивает. Посмотреть точность, аккуратность, разброс и силу пуль.
- Руки и ноги самые тяжело попадаемые места, из-за их постояннойподвижности. То есть, как было сказано выше, на сервере и клиентепрактически всегда они имеют разную позицию (регистрируется всего около70% попаданий), та же ситуация и с головой.
- Брызги крови – исключительно клиентская часть, и это вовсе непоказатель того, сколько раз Вы попали в игрока. Но, кровь, котораяостается на стенах и полу – серверная часть, по ней можно как разсудить о зарегистрированных попаданиях. Искры от бронежилета так же непоказатель попадания.Высокий пинг (до поры пока не начнется потеря пакетов и choke) особо невлияет на Вашу игру из-за корректировки лагов. Предел я вам не могуточно назвать (может 100-150), так как протестировать игру на высокийпинг не было возможности.
|