Real-Time Backend

Game Netcode

Два бойца в файтинге. Один нажимает удар - противник уже заблокировал. Или нет? При задержке 8 кадров (133 мс) игрок не знает, что происходит в реальном времени - только то, что было 133 мс назад. Rollback netcode решает эту проблему радикальным способом.

  • **Guilty Gear Strive** (Arc System Works, 2021) внедрил GGPO rollback - задержка ввода в онлайне упала с 8-12 кадров до 0-2 кадров (0-33 мс). Онлайн-продажи выросли на 40% относительно предыдущей части, которая использовала delay-based netcode.
  • **Valorant** использует 128 Hz tick rate с server-side lag compensation до 200 мс. Riot публично документирует алгоритм: сервер хранит 1024 мс истории позиций и реконструирует прошлое состояние для каждого выстрела отдельно.
  • **Counter-Strike 2** ввёл subtick system в 2023 году: вместо привязки событий к тику (1/64 с = 15.6 мс) каждое событие имеет точную временную метку внутри тика. Это сделало регистрацию попаданий точнее без повышения серверной нагрузки.
  • **GTA Online** использует dead reckoning с частотой обновления 10-20 Hz вместо 64 Hz для позиций транспортных средств. Это снижает серверную нагрузку при 30 игроках на сервере, ценой периодических «прыжков» быстро движущихся машин.

Tick Rate: сердцебиение игрового сервера

**Tick rate** - частота, с которой игровой сервер обрабатывает входные данные и обновляет game state. При 64 Hz сервер делает это 64 раза в секунду, каждые ~15.6 мс. При 20 Hz - каждые 50 мс. Разница критична: при 20 Hz игрок может выстрелить в интервале между тиками и промахнуться, даже если прицел был на месте.

Valorant использует 128 Hz для ranked матчей - каждые 7.8 мс. Counter-Strike 2 перешёл с 64 Hz на 128 Hz в 2023 году после давления комьюнити. Fortnite и Apex используют 20-30 Hz для battle royale (100 игроков - дорого). Tick rate напрямую определяет «честность» регистрации попаданий.

Subtick system (CS2, 2023): вместо привязки к тику Valve отслеживает точное время внутри тика. Выстрел в момент T=7.2 мс из 7.8 мс тика записывается с субтиковой точностью. Это устраняет дискретность 64-128 Hz и приближает регистрацию к реальному времени.

Почему игровые серверы используют busy-wait loop вместо setInterval для точного tick rate?

Lag Compensation: честность при разном пинге

Игрок с пингом 100 мс видит мир в прошлом на 100 мс. Когда он стреляет, враг уже успел уйти. Без lag compensation игроки с высоким пингом имели бы структурный disadvantage. **Lag compensation** решает это: сервер хранит историю позиций всех игроков и при регистрации выстрела откатывается к состоянию на момент, когда игрок нажал кнопку.

Lag compensation создаёт парадокс: игрок с 200 мс пингом может убить игрока, который уже ушёл за укрытие 200 мс назад. Valve ограничивает max compensation в Counter-Strike до 200 мс именно поэтому - иначе высокий пинг становился бы преимуществом.

Почему lag compensation ограничивается максимальным значением (например, 200 мс в CS)?

Dead Reckoning: предсказание позиций без данных

**Dead Reckoning** - экстраполяция позиции объекта на основе последнего известного состояния (позиция + скорость + ускорение). Термин пришёл из морской навигации: когда нет GPS, капитан рассчитывает текущую позицию по известному курсу, скорости и времени.

В играх dead reckoning применяется когда пакет задержан или потерян: вместо freeze клиент продолжает двигать объект по предполагаемой траектории. Работает хорошо при прямолинейном движении, плохо - при поворотах. GTA Online и MMO с тысячами игроков используют DR агрессивно, чтобы снизить частоту обновлений с 30 Hz до 5-10 Hz.

ABI (Autonomous Basic Infrastructure) в DIS/IEEE 1278 - военный стандарт dead reckoning для симуляторов. Определяет 9 алгоритмов DR (от простой линейной до квадратичной с угловым ускорением). Порог ошибки для отправки correction update - 1 метр или 3 градуса.

В каком сценарии dead reckoning даёт наименее точный результат?

Rollback Netcode: революция в файтингах

Традиционный delay-based netcode в файтингах добавлял фиксированную задержку ввода (4-8 кадров при 60 fps = 67-133 мс) для синхронизации. Результат: все нажатия ощущались как в желе. **Rollback netcode** переворачивает подход: каждый игрок выполняет предсказанный геймплей немедленно, а при получении реальных данных от оппонента - откатывает и пересимулирует пропущенные кадры так быстро, что это незаметно.

Street Fighter V имел задержку ввода 8-12 кадров в онлайне. Guilty Gear Strive (2021) перешёл на GGPO (rollback библиотеку) - задержка упала до 0-2 кадров. Mortal Kombat 11 добавил rollback в 2023 году патчем. Tekken 8 запустился с rollback в 2024 году, что стало индустриальным стандартом.

Rollback netcode полностью устраняет визуальные артефакты при плохой сети

Rollback скрывает задержку, но при сильном расхождении предсказания (неожиданный input оппонента) происходит заметный "прыжок" состояния игры

Если оппонент делает unexpected action (например, специальный удар вместо обычного) на кадре N, а предсказание было неверным - после rollback визуальное состояние скачет. В плохих сетевых условиях (пинг 200+ мс, потери пакетов) rollback даёт частые артефакты. Delay-based netcode в этих условиях может быть стабильнее.

Почему rollback netcode работает лучше для файтингов, чем для MMO с тысячами игроков?

Итоги

  • **Tick rate** (64-128 Hz) определяет granularity игровой симуляции: выше tick rate - точнее регистрация попаданий, дороже серверная нагрузка; subtick (CS2) даёт субмиллисекундную точность без роста Hz
  • **Lag compensation** откатывает историческое состояние мира на момент выстрела стрелка, делая игру честной при разном пинге; ограничение 200 мс предотвращает превращение лага в преимущество
  • **Rollback netcode** пересимулирует пропущенные кадры вместо добавления задержки ввода, снижая ощущаемую latency файтингов с 133 мс до 0-33 мс ценой редких визуальных артефактов

Связанные темы

Game netcode строится поверх более общих принципов realtime-систем:

  • Multiplayer Game Networking — Предыдущий урок: client prediction и server reconciliation как основа для lag compensation
  • Low-Latency Live — Схожие задачи latency-бюджета, но для видеостриминга вместо игровых событий
  • Event Sourcing — Rollback - это event sourcing в реальном времени: откат к прошлому состоянию + replay событий

Вопросы для размышления

  • Как subtick system Counter-Strike 2 изменяет традиционную модель tick-based симуляции? Какие новые сложности это вносит?
  • При каком значении пинга lag compensation начинает создавать больше проблем (читы, визуальные артефакты), чем решает? Как разработчики устанавливают этот порог?
  • Можно ли применить rollback netcode к реальному времени (RTS игры с тысячами юнитов)? Что принципиально меняется по сравнению с файтингами?

Связанные уроки

  • net-01-intro
Game Netcode

0

1

Войти