Факторио... ох, факторио. шикраная игра и шикарный мультиплеер.

Самое странное, что мультиплеер работает. То есть не просто работает, а у него нет лагов, все синхронно работает. То есть, не просто движения человечков и жуков, а прям ну весь завод. У всех игроков одновременно. Почему, что, кааак? Это же миллионы вычислений и синхронизаций между игроками в стандартном формате.

Вообще когда первый раз заходишь в мультиплеер — замечаешь что-то странное. Всё работает синхронно. Не «почти синхронно» как в большинстве онлайн-игр, а буквально идентично. Фабрики тикают одновременно. Конвейеры двигаются одинаково. Нет рассинхрона, нет интерполяции, нет ощущения что ты видишь чуть другую картину чем сосед. А оказалось, что это прям сильное архитектурное решение.

Большинство мультиплеерных игр используют client-server архитектуру с предсказанием. Клиент показывает тебе что происходит прямо сейчас — угадывает позиции других игроков, интерполирует движение — и периодически синхронизируется с сервером. Отсюда рабербенд, рассинхрон, «я выстрелил а он уже за углом» и все причитающееся.

А вот у факторио все иначе, у него локстеп. Игра берет тактовую систему, записывает в каждом такте все нажатия всех кнопок всех игроков и синхронизирует их поведение, после этого у кадлого клиента показывается движение по следующему такту. Детерменизм как он есть, одно действие всегда даст один и тот же результат. В такой системе нет рассинхрона вообще. Локстеп — так-то старая идея. Его использовали ещё в Age of Empires и Starcraft. Для стратегий он идеален — симуляция детерминированная, инпутов немного, можно позволить себе ждать. Для шутеров или RPG такое не работает — там важна моментальная реакция, 16мс задержки уже ощутимы, и симуляция недетерминированная из-за физики.

Факторио — стратегия с дискретной симуляцией. Каждый объект в игре обновляется по строгим правилам без плавающей точки и рандома без сида. Это позволяет гарантировать что две машины запустившие одну и ту же последовательность инпутов получат абсолютно идентичный результат.

Локстеп имеет одну фундаментальную проблему: игра не может быть быстрее самого медленного игрока. Все синхронные, все на равных условиях. Нет никого уникального. Если у кого-то в сессии лагает интернет — все ждут. Сервер не может начать следующий тик пока не получил инпуты от всех. Поэтому в Факторио при плохом соединении одного игрока все видят как игра буквально замедляется — не у него, у всех одновременно.

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

А еще есть крутой бонус - реплеи нативные. Еще и весят копейки, вместо всего стейта игры сохраняешь только инпуты и вуаля! Тот же результат! На самом деле - решение элегантное и сложнее, чем я описал, но сама суть такова.

Факторио... ох, факторио. шикраная игра и шикарный мультиплеер.
Самое странное, что мультиплеер работает. То есть не просто работает, а у него нет лагов, все синхронно работает | Сетка — социальная сеть от hh.ru