Цю сторінку ще не перекладено — показано англійську версію.
Lag Compensation
Компенсація лагів (lag compensation) — серверний механізм, і її помилки коштують гра вцеві життя — на користь того, в кого з’єднання гірше. Ця асиметрія визначає все, що є на цій сторінці.
Питання, на яке вона відповідає, вузьке: що насправді бачив стрілець? Дія може містити момент огляду — тік, який актор бачив, коли діяв. Платформа відновлює пози цілей на цьому тіку, щоб оцінити постріл за тим, що було в стрільця на екрані.
Момент огляду — це твердження, а не факт
Момент огляду надходить від клієнта, тож це заява сторони, яка викликає, і ставляться до нього саме так. Звідси два наслідки:
- Вікно компенсації обмежене, і за його межами платформа відмовляє. Вона не екстраполює з добрих намірів: відмову видно як рішення, а мовчазну екстраполяцію — ні.
- Читання минулого стану цілі так само підкоряється видимості. Запит про історичний тік не дає обійти Visibility: чого ви не могли бачити тоді, того не прочитаєте й зараз.
А «влучання не зараховано» — це вердикт, а не помилка: успішна відповідь із машиночитною причиною.
Що відкочується, оголошено, і відкочується не все
Якщо відкочувати все, виходять подвійні вбивства: два гравці стріляють один в одного, обох відмотують до моменту, коли обидва живі, і обидва влучають. Якщо не відкочувати нічого, зникає сама компенсація лагів. Межу між цими крайнощами задає оголошений список.
Сам відкат належить цьому модулю, а не тим, чий стан відмотують. Кільце історії відновлює пози спірного тіку, а потім модулю Collision ставлять звичайне питання про перетин цих поз. Власної історії модуль Collision не зберігає, і ніщо в ньому не знає, що таке тік огляду. А саме кільце — це історія сутності, а не друге сховище.
Рішення ухвалюють за минулим, а наслідки застосовують у теперішньому
Компенсація лагів відповідає на питання про момент, який бачив стрілець. А наслідки — шкода, смерть, нагорода — застосовуються до поточного стану. Те, що сталося між моментом огляду й моментом рішення, ніхто не скасовує і не перераховує.
Гравець може вистрілити вже після того, як його вбили
Гравець (player) може встигнути вистрілити після того, як його вбив чужий постріл, оцінений з відкатом. Так задумано: скасувати такий постріл означало б програвати світ заново поверх відкату, який не обіцяє відтворюваності. Це не прибрало б розбіжність, а створило б її.
Повторна симуляція на сервері не входить у завдання модуля. Щоб перерахувати наслідки під нову істину, потрібна фіксована точка відліку, а стан у числах із рухомою комою її не дає. Лишається все, на чому тримається модуль: клієнт повторно програє власне непідтверджене введення (Передбачення власного руху), а компенсація лагів — це читання минулого заради одного рішення. Саме так на практиці працює підхід «на користь стрільця».
Якщо ви переходите з іншого рішення
- Компенсація лагів на користь стрільця, як у більшості змагальних шутерів: механізм той самий, і ця сторінка саме про нього.
- Повноцінний rollback-неткод. Відкат тут є, а повторного прогону світу після нього немає — чому, пояснює абзац вище. Якщо ваш геймдизайн залежить від того, що наслідки перераховуються заднім числом, обговоріть цю залежність із нами заздалегідь, а не виявляйте її надто пізно.
Що ще варто знати
- Реалізацію можна перевизначити. Якщо вашій грі потрібне інше правило компенсації, ви можете замінити наше, а заміна оголошує, яких оголошень вона дотримується.
- На шляху передбачення й корекції точок розширення немає. Ці кроки виконуються з частотою тіку.
- За зовнішнього авторитетного джерела нічого з цього не діє. Компенсація лагів існує для кімнат (room), які виконує си муляція платформи. Коли тік належить ігровому серверу студії або майстер-клієнту, компенсація належить тому, хто тік виконує, — див. Хто виконує тік.