
Фишки в CSS
Ниже описана ситуация, которую я сейчас поясню.
Вы выходите из-за угла стены/ящика и тут же быстро уходите назад. Вы не видите врага, но при этом получаете повреждения.
Постараюсь изложить в максимально доступной форме.
Итак, для начала несколько определений:
Latency (ping) – пинг - временной промежуток, за который пакет, отосланный от вашего компьютера проходит до сервера (и наоборот). В миллисекундах
Server - Сервер – Выделенный сервер в Интернете, расположенный на каком-нибудь компьютере.
Client Клиент – Игра, запущенная на вашем компьютере. Клиент подключается к Серверу. На сервере может выставляться количество возможных подключаемых клиентов.
Shot Trajectory - Траектория выстрела – Линия между концом дула вашего оружия и местом, куда попала ваша пуля.
Hitbox – Хитбокс – модели игроков в Counter-Strike: Source поделены на так называемые Хитбоксы (hitboxes), которые блокируют различные участки моделей. В одной моделе существует множество хитбоксов . Если выстрелить в хитбокс, то значение здоровья и броняи игрока уменьшается.
CS:Source – Основы
В абсолютно любом сетевом 3D шутере, главной проблемой, которую решают в первую очередь, является пинг. Каждый игрок должен видеть тоже что видят и его соперники. Соперники же должны двигаться плавно, без рывков и задержек – ведь на самом деле игра обновляется периодически, а время между отправкой и получением пакета порой может быть очень длинным промежутком.
Немного информации
На карте Ваша позиция у Вас на мониторе относительно вас же на сервере и вас же на экранах других клиентов никогда не будет одинаковой. Это происходит по причине задержки, из-за того, что Ваш компьютер отсылает серверу пакет с информацией о Вашем местоположении, сервер симулирует как бы кадр игры, обновляет у себя о Вас информацию, после чего отправляет информацию о Вас другим клиентам, а они получают и обновляют уже о Вас информацию у себя. Эта проблема в связке с тем, что у вас на экране все выглядит плавно, составляет неприятную картину.
Такая картина иногда видна в самой игре, зачастую приводя к недоумению игроков.
Ситуация «Слайдшоу из хитбоксов»:
«Вы выходите из-за угла стены/ящика и тут же быстро уходите назад. Вы не видите врага ,но при этом вы получаете повреждение.»
Объяснение:
Чтобы объяснить причину такого поведения игры, мы должны принять во внимание все, что происходит на Вашем компьютере, на компьютере сервера и на компьютерах других игроков.
* Вещи, о которых Вам надо знать, перед тем, как я продолжу Фактические повреждения (ну или расположения хитбоксов, если так понятнее) просчитываются на стороне сервера. Но на стороне клиента также отслеживается положение хитбоксов, но чисто для визуализации (скажем, искры от пуль при поподании в броню, брызги крови из тела и тд.), но об этом мы подробнее поговорим, когда дойдем до третьей ситуации.
* В идеале обмен пакетами происходит в течении 10 миллисекунд. Это то время за которое сервер успевает обновить информацию о Вас, а Вы – о сервере. Но на практике эта цифра бывает в разы больше, судя по пингу.
* Время, которое тратится клиентом и сервером на обработку полученной информации столь мало, что его даже не имеет смысла брать во внимание.
Проблема в данной ситуации наблюдается в случае, если происходит так называемая «коррекция задержек (лагов)», которая встроена в движок 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, независимо от того, где последний находится сейчас.
Сервер высчитывает идеальное значение переноса траекторий выстрелов, основываясь на пинге всех игроков.