Перейти до основного вмісту
Жива гра

Цю сторінку ще не перекладено — показано англійську версію.

Lag Compensation

Компенсація лагів (lag compensation) — серверний механізм, і її помилки коштують гравцеві життя — на користь того, в кого з’єднання гірше. Ця асиметрія визначає все, що є на цій сторінці.

Питання, на яке вона відповідає, вузьке: що насправді бачив стрілець? Дія може містити момент огляду — тік, який актор бачив, коли діяв. Платформа відновлює пози цілей на цьому тіку, щоб оцінити постріл за тим, що було в стрільця на екрані.

Момент огляду — це твердження, а не факт

Момент огляду надходить від клієнта, тож це заява сторони, яка викликає, і ставляться до нього саме так. Звідси два наслідки:

  • Вікно компенсації обмежене, і за його межами платформа відмовляє. Вона не екстраполює з добрих намірів: відмову видно як рішення, а мовчазну екстраполяцію — ні.
  • Читання минулого стану цілі так само підкоряється видимості. Запит про історичний тік не дає обійти Visibility: чого ви не могли бачити тоді, того не прочитаєте й зараз.

А «влучання не зараховано» — це вердикт, а не помилка: успішна відповідь із машиночитною причиною.

Що відкочується, оголошено, і відкочується не все

Якщо відкочувати все, виходять подвійні вбивства: два гравці стріляють один в одного, обох відмотують до моменту, коли обидва живі, і обидва влучають. Якщо не відкочувати нічого, зникає сама компенсація лагів. Межу між цими крайнощами задає оголошений список.

Сам відкат належить цьому модулю, а не тим, чий стан відмотують. Кільце історії відновлює пози спірного тіку, а потім модулю Collision ставлять звичайне питання про перетин цих поз. Власної історії модуль Collision не зберігає, і ніщо в ньому не знає, що таке тік огляду. А саме кільце — це історія сутності, а не друге сховище.

Рішення ухвалюють за минулим, а наслідки застосовують у теперішньому

the shooterthe server fired, seeing the world several ticks agorewind the declared state to that tick, judge thereapply the effect in the presentthe outcome
Постріл оцінюють на тіку, який бачив стрілець, а наслідки застосовують у теперішньому

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

Гравець може вистрілити вже після того, як його вбили

Гравець (player) може встигнути вистрілити після того, як його вбив чужий постріл, оцінений з відкатом. Так задумано: скасувати такий постріл означало б програвати світ заново поверх відкату, який не обіцяє відтворюваності. Це не прибрало б розбіжність, а створило б її.

Повторна симуляція на сервері не входить у завдання модуля. Щоб перерахувати наслідки під нову істину, потрібна фіксована точка відліку, а стан у числах із рухомою комою її не дає. Лишається все, на чому тримається модуль: клієнт повторно програє власне непідтверджене введення (Передбачення власного руху), а компенсація лагів — це читання минулого заради одного рішення. Саме так на практиці працює підхід «на користь стрільця».

Якщо ви переходите з іншого рішення

  • Компенсація лагів на користь стрільця, як у більшості змагальних шутерів: механізм той самий, і ця сторінка саме про нього.
  • Повноцінний rollback-неткод. Відкат тут є, а повторного прогону світу після нього немає — чому, пояснює абзац вище. Якщо ваш геймдизайн залежить від того, що наслідки перераховуються заднім числом, обговоріть цю залежність із нами заздалегідь, а не виявляйте її надто пізно.

Що ще варто знати

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