Що таке ping і з чим його їдять

Що таке PING і з чим його їдять?

Вирішив я пограти в Counter-Strike: Source, щоб подивитися і зрозуміти принцип роботи самої гри і, по можливості, відшукати фішки, які непогано було б знати при грі в Counter-Strike: Source. І привело це до того, що я їх знайшов. Деякі з них складні, деякі легкі, деякі цікаві, але більшість нудні =).
    Нижче описані три ситуації, які я зараз поясню.
  1. Ви виходите з-за рогу стіни / ящика і тут же швидко йдіть назад. Ви не бачите ворога, але при цьому отримуєте пошкодження.
  2. Ви вибігаєте з-за рогу на ворога, висаджуєте в нього всю обойму і вмираєте. Після чого відкриваєте консоль і бачите, що потрапили в нього всього двічі, не дивлячись на те, що випустили в нього всю обойму в упор.
  3. Ви стріляти з ворогом, потрапляєте - бачите, що на його тілі і навколо є кров, але в підсумку потрапляння не були зареєстровані і ворог не отримав жодного ушкодження.
Я витратив на тести близько тижня, щоб зрозуміти, чому трапляються такі ситуації і чи є вони помилками Valve. Описані нижче ув'язнення і спостереження, до яких я прийшов на протязі тижневого тесту гри, я спробую викласти в максимально доступній формі для звичайного Новомосковсктеля.

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

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

Трохи інформації
На карті Ваша позиція у Вас на моніторі щодо вас же на сервері і вас же на екранах інших клієнтів ніколи не буде однаковою. Це відбувається через затримку, через те, що Ваш комп'ютер відсилає серверу пакет з інформацією про Ваше місцезнаходження, сервер симулює як би кадр гри, оновлює у себе про Вас інформацію, після чого відправляє інформацію про Вас іншим клієнтам, а вони отримують і оновлюють вже про Вас інформацію у себе. Ця проблема в зв'язці з тим, що у вас на екрані все виглядає плавно, становить неприємну картину.

Що таке ping і з чим його їдять
Така картина іноді видно в самій грі, часто приводячи до здивуванню гравців.

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 мілісекунд назад виявився знову в своєму укритті.

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

Що таке ping і з чим його їдять
Ну і виходить в результаті наступна картина: Сервер отримує інформацію про постріли Гравця 2 по Гравцеві 1, в той час як Гравець 1 знаходиться вже зовсім в іншому місці, отже, пошкодження від пострілів не враховуються. Це не дуже-то справедливо, по відношенню до Гравця 2, так як він-то якраз бачить в цей час Гравця 1.

І цілком резонне питання виникає: як вирішувати цю проблему? Движок Source робить наступне. А саме програма прораховує траєкторію пострілу Гравця 2 і переносить її так, як ніби він стріляв в реального Гравця 1, незалежно від того, де останній перебуває зараз.
Сервер вираховує ідеальне значення перенесення траєкторій пострілів, грунтуючись на пінг всіх гравців.

Що таке ping і з чим його їдять
На зображенні: червоний хітбокс показує нам, де знаходився клієнт, коли я стріляв по ньому. Синій же показує, де знаходився клієнт на сервері, коли той (сервер) отримав інформацію про моїх пострілах. Зверніть увагу на червоний цілісний кубик в червоному хітбоксе. Це те місце, куди потрапив мій постріл у мене на клієнті. Синій же кубик в синьому хітбоксе - це ж місце положення попадання від мого пострілу, але з поправкою на мій пінг. Але не виключено, що траєкторія пострілу на моніторах інших гравців так і залишилася старою. Збиває з пантелику!

Тепер розглянемо Сцени з «корекцією Пінг»
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). На них показана різниця між позиціями гравця на сервері (синій хітбокс) і на клієнті (червоний), і траєкторія пострілу, яка показана червоним і синім кубиком. Звернемо увагу - сервер відкоригував траєкторію пострілу щодо ворога.

Що таке ping і з чим його їдять
Що таке ping і з чим його їдять

2 Ситуація «Що за маячня! Я в нього випустив всю обойму! »:

«Ви вибігаєте з-за рогу на ворога, висаджуєте в нього всю обойму і вмираєте. Після чого відкриваєте консоль і бачите, що потрапили в нього всього двічі, не дивлячись на те, що випустили в нього всю обойму в упор. »

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

Головна річ, яку слід зрозуміти, це те, що речі, які відбуваються на сервері, відбуваються раніше, ніж у вас на комп'ютері - вашому клієнті. Для полегшення розуміння ситуації, домовимося, що на обох клієнтів лаги (пінг) однакові, так що не треба напружуватися і вираховувати корекцію між двома машинами.

Отже, коли Гравець 1 підходить до кута, то обидва клієнта (і Гравець 1 і Гравець 2) знають про це, тут немає затримок, у обох синхронізована інформація. Виходячи, обидва починають стріляти. Тепер, через затримки (йде обмін інформацією про постріли) кожному, щоб побачити іншого стріляючого клієнта, буде потрібно 60 мілісекунд (згадайте першу ситуацію, так само і для відсилання пошкоджень. Це означає, що за час поки дет обмін цією інформацією, ви зможете вистріляти купу набоїв. і якщо Ваш опонент почав стріляти на якусь частку секунди раніше Вас (або навіть якщо раніше, але він потрапив Вам, скажімо, в голову), і Ви вже можливо мертві, але Ваш клієнт не знає ще поки про це , адже для цього треба 60 мілісекунд з моменту як Ви побачили ворог а! В результаті сервер просто ігнорує всі Ваші постріли, випущені до моменту поки Вас не вбили, і вбиває Вас. А у Вас створюється ілюзія, що Ви випустили цілу обойму, перед тим як Вас вбили.

3 Ситуація «Холостий постріл!»:

«Ви стріляти з ворогом, потрапляєте - бачите, що на його тілі і навколо є кров, але в підсумку потрапляння не були зареєстровані і ворог не отримав жодного ушкодження.»

Давайте тепер розберемо, як сервер транслює наш постріл на нову траєкторію з урахуванням коригування. Як відомо, сервер обробляє не тільки всі об'єкти на карті, позиції моделей, а й так само анімацію моделей (біг, ходьба і ін.). Коли Ви стріляєте, постріл транслюється на сервері, тестується на ступінь пошкодження, незалежно від того, в якій позі була модель. Тому що через затримки модель на сервері і модель на клієнті дуже рідко бувають в однакових позиціях. Наприклад, анімації дуже рідко бувають в одному кадрі, і виходить, що кожна поза в одне і теж час знаходиться в трохи різних точках. Найрухоміша анімація це біг і стрейфи. Хитання голови, рук і ніг - все в русі. Виходить, що якщо Ви стріляєте в плече, Ваш постріл транслюється на сервер, де модель, в яку Ви вистрілювали, може вже перебувати в іншій позі, наприклад, голова повернута в іншу сторону, нога перенесена і тд.

Погляньмо на скріншот і подивимося, і переконаємося в тому, що моделі на сервері і на клієнті знаходяться і, правда, в різних позах.

Що таке ping і з чим його їдять
Відзначимо, що різниця між позиціями ніг на сервері і клієнті істотно велика (сервер - синій хітбокс, клієнт - червоний). Постріл, який зробив гравець, відзначений червоною буквою «А», він не буде зареєстрований на сервері, так як там ця ж нога знаходиться в іншому місці. Але гравець буде впевнений, що потрапив по ворогу.

А ось типовий приклад, коли потрапляння не реєструється сервером - я стріляю в край рюкзака (який природно має різні положення як на сервері так і у мене на моніторі), і синій бокс виявився на стіні позаду, оскільки сервер не реєстрував поранення.

Що таке ping і з чим його їдять
Але це не баг, а необхідний, легко реалізовується шлях, який довелося використовувати для збільшення продуктивності. Щоб перевіряти всі постріли по одній певної моделі, враховуючи всі її положення за кожен певний відрізок часу, сервера доведеться стежити або прораховувати всі затримки моделей для кожного гравця на сервері.

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

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

Але не варто забувати, що бувають і також зворотні ситуації (ви промахується у себе на комп'ютері, але сервер зараховує вам потрапляння), таким чином стрілянина вирівнюється.

Схожі статті