Как сообщил мне GPT5, технология компенсации сетевой задержки в играх, также известная как «откат сетевого кода» (rollback netcode) впервые была применена в игре «Super Street Fighter II Turbo HD Remix» (2008). Но это не так: именно такой механизм я реализовал в «Pathway to Glory» (Nokia N-Gage, 2004) и «Warhammer 20K: Squad Command (PSP, NDS, 2007)». В этой статье кратко рассказано, как данная технология работает...

Уверен, что это не я изобрёл откат сетевого кода. Идея зародилась под влиянием банкинга, но припоминаю, что кто-то описывал её в своём блоге. В комментариях к этой статье прошу вас написать, в какой игре, на ваш взгляд, она была задействована впервые, и кто был изобретателем этой технологии. Определённо, это было до SF2.

Откат сетевого кода — это технология, позволяющая получать пакеты с запаздыванием и вставлять их в историю событий. Состояние игры откатывается до предыдущего состояния, а тем временем применяется поступившая информация (команда, изменение состояния). После этого быстро (без рендеринга) выполняется N шагов игровой логики, помогающих нагнать ситуацию до актуального кадра.

Nokia N-Gage был первым широко доступным сотовым игровым гаджетом с возможностью онлайнового многопользовательского режима. Это была обычная аппаратная платформа для телефона, только сбоку устройства дополнительно выводилась игровая крестовина. Компания  Nokia приобрела у SEGA технологию онлайновых взаимодействий SNAP, которую SEGA лицензировала разработчикам игр из Microsoft/Sony/Nintendo.

Компания Microsoft выкатила собственный сервис Xbox Live, поэтому исчезла потребность в SEGA SNAP. Кроме того, SEGA проигрывала конкуренцию на рынке консолей, поэтому и продала Nokia свой сетевой стек. Аббревиатура SNAP означала «Sega Network Application Protocol» (Протокол сетевых приложений SEGA) и впоследствии была переосмыслена как «Scalable Network Application Protocol» (Масштабируемый протокол сетевых приложений).

В Nokia N-Gage был модем GPRS (2.5G). Для него была типична круговая задержка (Roundtrip latency) порядка 1 секунды. При этом тарифный план с безлимитным мобильным интернетом в Финляндии стоит ещё 50€/месяц. Слишком медленно, чтобы сидеть в Интернете, поэтому такой тариф никто не брал. 

Игра «Pathway to Glory» на N-Gage была 6-пользовательской стратегией реального времени (RTS). Между всеми игроками прокладывались прямые пиринговые соединения. Игра была детерминированной. Детерминизм в данном случае означает, что, если выполнить идентичную команду одновременно на всех клиентах в рамках одного и того же кадра, то игра на всех устройствах будет на 100% синхронизирована.

В качестве ЦП на этом устройстве использовался медленный одноядерный ARM920T с частотой 104 МГц. Математического сопроцессора (FPU) не было. В рамках всей игры применялась арифметика с фиксированной точкой. Разработчики многих более поздних детерминированных онлайновых игр также остановились на арифметике с фиксированной точкой, поскольку оптимизации операций с плавающей точкой отличаются от компилятора к компилятору, и из-за этого возникает нежелательная рассинхронизация.

Оперативная память N-Gage составляла всего 16 МБ (0,016 ГБ), поэтому было невозможно полностью записать всё состояние игрового мира целиком. Поэтому существовал список игровых объектов, активных в настоящее время. В каждом игровом объекте был указатель на исторические данные, практически это был связный список предыдущих состояний кадра.

Более ранние состояния были сохранены лишь для тех объектов, что активны в настоящий момент, поэтому память расходовалась экономно. Мы хранили для каждого объекта историю длительностью 5 секунд, поскольку именно с такой максимальной задержкой могли справиться.  

В любой момент одновременно оставались активными лишь несколько объектов. Это была стратегия реального времени для игры 3 на 3, но множественный выбор не предусматривался (дисплей слишком маленький). Можно было быстро нажимать select->move, select->move, чтобы параллельно выполнять сразу несколько команд. Ваши союзники по команде также двигались одновременно с вами.

У каждой команды был номер кадра. Если этот номер относился к будущему, то команда ставилась в очередь на выполнение. Если в прошлом — то инициировался откат к нужному кадру. В игре перебирался список активных объектов, состояния которых восстанавливались до нужного кадра.

Затем мы вновь выполняли N кадров игровой логики, чтобы нагнать актуальный кадр. Эта часть строится по стандартной логике навёрстывания тактов (tick catch up). Как обычно, если логический кадр мы уже миновали, отрисовка пропускается, пока логика не догонит игровой процесс.  

Логика в игре «Pathway to Glory» была супербыстрой. Такты выделялись лишь на объекты из «активного» списка. Обычно в этом списке было <10 объектов. Частота игры составляла 30 Гц, поэтому не составляло труда откатиться на пару секунд  = 60 тактов. Можно было просто циклически прогонять такты для 10 объектов по 60 раз. Нормально работает даже на ЦП с частотой 104 МГц.

Если требовалось откатить достаточно длительный отрезок времени, на который при этом приходились какие-то ресурсозатратные события (например, взрывы), то при откате можно было заметить выпадение кадров. Взрывы или попадания по получателю также на какой-то краткий период становились активными объектами, поэтому для отката записывалось и их состояние.

Было два списка активных объектов. В первый включались объекты, активные в настоящее время, а во второй — объекты, активные в пределах окна отката. То есть, во второй список входили те объекты, которые потенциально могло понадобиться откатить. Но игровая логика распространялась лишь на объекты, активные в настоящий момент. Следовательно, на тех, кто словил урон, такты не тратились.

Чтобы скрыть 1 секунду сетевой задержки и пробуксовки из-за отката, нам пришлось добавить голосовые «команды» и «отклики», например, «Есть, сэр!» или «Приказ понял!». Солдат или мехвод выкрикивали это и лишь затем начинали движения. Кадр команды = актуальный + 30. То есть, солдат начинает движение через секунду.

Если задержка в сети не превышала 1 секунды, то адресаты получали команду до того, как начинался кадр с её выполнением, поэтому никакого отката не происходило. Если задержка была больше — задействовали откат. Если задержка была короче, то команда ставилась в очередь на выполнение.

В 2004 году казалось каким-то сюром, что можно играть с друзьями в 6-пользовательский шутер на старом телефоне прямо в ночном клубе. Опыт уникальный. Много вечеринок минуло с тех времён, когда Nokia вкладывала большие деньги, чтобы выглядеть большим тузом в игровой индустрии. Сколько с тех пор пошло прахом…

В «Warhammer 40K: Squad Command» (RedLynx/THQ 2007, Sony PSP / Nintendo DS) использовался тот же движок, что и в «Pathway to Glory». В базе кода повсюду был мой код сетевого отката, но я его не поддерживал. Я написал наш новый движок 3d-рендеринга для этой игры. Стал ведущим разработчиком графики.

Комментарии (0)