Factorio: лагает при росте мира/производства
Первые часов пятьдесят сервер Factorio летает — 60 UPS, никаких вопросов. А потом база разрастается до сотен ленточных конвейеров, десятков составов и завода на жидкостях, и вдруг игра начинает подтормаживать именно в те моменты, когда всё интересное только начинается. Это не баг и не «сервер плохой» — это нормальная кривая роста нагрузки в Factorio, и с ней можно работать осознанно, а не просто покупать тариф побольше и надеяться.
Содержание
Почему Factorio упирается не в FPS, а в UPS
В отличие от шутеров и большинства survival-игр, у Factorio нет отдельного понятия «тикрейт сервера» в привычном смысле — есть UPS (updates per second), целевая частота обновления игровой симуляции, по умолчанию 60 в секунду. Это тот же показатель, что и графический FPS в одиночной игре, но в headless-режиме на сервере он отвязан от рендеринга и напрямую отражает, успевает ли игра пересчитать весь мир за отведённые ~16.6 мс.
Ключевая особенность, которая многих удивляет: основной цикл симуляции Factorio однопоточный. Игра использует несколько потоков — для звука, части сетевого кода, вспомогательных задач — но пересчёт сущностей, конвейеров, электросети и логистики идёт последовательно на одном ядре. Значит, «доложить ещё ядер» на сервер часто почти не помогает: если один поток CPU упирается в потолок, свободные ядра рядом просто простаивают. Отсюда практический вывод: для Factorio важнее частота одного ядра, а не их количество.
Просадка UPS прогрессирует медленно — база растёт органично, и в какой-то момент вы замечаете, что персонаж двигается рывками, а составы прибывают на станции с задержкой. Смотреть на это стоит через встроенный счётчик UPS (клавиша ~ открывает консоль, в настройках интерфейса можно включить постоянный показ UPS в углу экрана) — первый и самый простой индикатор, что пора разбираться, а не «показалось».
Что реально грузит тик: разбор по типам объектов
Не все объекты в мире Factorio одинаково дороги для симуляции. Прежде чем оптимизировать наугад, полезно понимать, куда обычно утекает время тика по мере роста фабрики:
- Конвейерные ленты и инсёртеры. Каждый сегмент ленты и каждый инсёртер обновляется свой кусочек логики каждый тик. На ранней стадии это не проблема, но при тысячах метров лент суммарная стоимость становится заметной — особенно если ленты забиты не полностью и предметы двигаются вразнобой, а не стоят плотной стопкой.
- Поезда и сигнализация. Каждый состав, ищущий путь через сеть со светофорами, — отдельная вычислительная задача. Разветвлённая сеть с частой сменой маршрутов (например, из-за динамических условий на станциях) дороже, чем небольшое число простых челночных маршрутов.
- Логистические и строительные боты. Большое количество ботов, постоянно перестраивающих маршруты, ощутимо грузит тик — особенно если сеть роботов покрывает всю карту и боты в ней почти не простаивают.
- Схемы на комбинаторах (circuit network). Сложные счётные схемы — «сушистые» ленты-сортировщики, самодельные калькуляторы на комбинаторах — один из самых недооценённых источников нагрузки: с виду безобидная схема на полсотни комбинаторов может стоить дороже целого производственного цеха.
- Жидкости. Смешение и перетекание жидкостей по трубам пересчитывается отдельно от твёрдых предметов, и разветвлённые сети труб с несколькими типами жидкостей (нефтепереработка, химия) добавляют долю к бюджету тика.
- Биттеры, загрязнение и эволюция. Чем больше загрязнения выбрасывает завод, тем выше фактор эволюции и агрессивнее враги; большие колонии биттеров, атакующие оборону или мигрирующие, заметно нагружают ИИ-пересчёт путей. Если карта настроена на активную войну с биттерами, а не мирный режим — это отдельный и часто недооценённый вклад в просадку UPS.
Общий принцип, которым руководствуется опытное сообщество Factorio: чем меньше отдельных обновляемых объектов на карте при том же объёме производства, тем дешевле тик. Поэтому на мегабазах нередко заменяют длинные ленты на составы уже там, где новичок ещё спокойно тянул бы ленту — но это архитектурное решение, зависящее от масштаба и вкуса, а не жёсткое правило.
Поднять сервер Factorio за пару минут
Готовый образ MAATRIX GAMES: NVMe, AMD EPYC, DDoS-защита, панель управления. Локации UK, US, RU. Оплата картой РФ, СБП или криптой.
Создать серверКак увидеть проблему, а не гадать: встроенная диагностика
Прежде чем что-то менять в конфиге или базе, стоит понять, что именно ест время тика — благо у Factorio для этого есть штатные инструменты, без сторонних плагинов.
Debug-меню и разбивка по системам. Подключитесь клиентом к серверу (даже если он headless — зайдите как обычный игрок) и откройте расширенное отладочное меню клавишей F4. В категории, отвечающей за время выполнения, включите показ разбивки по системам — появится оверлей с долями времени тика на обновление сущностей, электросеть, логистику, конвейеры, жидкости и так далее. Это достоверно даже в мультиплеере: сетевой код Factorio построен на детерминированном лок-степе, каждый клиент пересчитывает тот же мир из тех же входных данных, что и сервер, а не просто получает готовую картинку — значит, цифры в оверлее реально отражают стоимость тика.
Встроенный бенчмарк для headless-сервера. Если нужна объективная цифра «сколько миллисекунд стоит тик на этом конкретном сейве» без захода в игру — headless-бинарник умеет прогонять сейв через заданное число тиков в максимально возможном темпе и печатать среднее время:
./bin/x64/factorio --benchmark ~/factorio-server/factorio/saves/base.zip \
--benchmark-ticks 1000 \
--benchmark-runs 3
Полезно гонять такой бенчмарк периодически (например, раз в несколько игровых недель) и сравнивать результат с прошлым — так рост стоимости тика видно объективно, а не по ощущениям «вроде стало хуже».
Консольная команда для эволюции. Если подозреваете, что причина в биттерах, — команда /evolution в консоли покажет текущий фактор эволюции на поверхности. Резкий рост этого числа обычно коррелирует с ростом агрессии врагов и, соответственно, нагрузки на пересчёт их поведения.
Общие принципы диагностики лагов — как отличить просадку тика от сетевых проблем или проблем на стороне клиента — разобраны отдельно и применимы к любой игре, включая Factorio, в статье про мониторинг TPS и лагов на игровом сервере.
Автосейв: почему он бьёт по UPS сильнее, чем кажется
Автосейв — отдельная головная боль при росте базы, и не только потому, что занимает место на диске. Файл сохранения растёт вместе с фабрикой: чем больше сущностей, исследованной карты и статистики производства накопилось, тем дольше и тяжелее сама операция записи на диск.
Хорошая новость — автосейв в Factorio давно идёт в фоновом потоке, не блокируя полностью основной цикл симуляции, так что жёсткого замирания на несколько секунд обычно не происходит. Плохая новость — на действительно крупных сейвах (гигабайты) фоновая запись всё равно отъедает часть ресурсов CPU и диска параллельно с симуляцией, и на нагруженном железе это заметно как кратковременная просадка UPS именно в момент автосейва.
Что стоит пересмотреть по мере роста базы в server-settings.json:
autosave_interval— по умолчанию часто стоит 10 минут; на большой базе с тяжёлым сейвом имеет смысл увеличить интервал (например, до 15-30 минут), особенно если база стабильна и риск потерять прогресс за полчаса вас устраивает.autosave_slots— количество хранимых автосейвов по кругу; больше слотов — больше свободного места на диске нужно заранее, потому что каждый файл на мегабазе может весить сотни мегабайт.autosave_only_on_server— если это мультиплеер, включитеtrue: тогда локальный автосейв делает только сервер, а не каждый подключённый клиент параллельно у себя же (что при дефолтных настройках клиента добавляет лишнюю нагрузку на диск и сеть каждому игроку одновременно с серверным сейвом).
Простое практическое правило: если бенчмарк или собственные ощущения показывают, что тик стал заметно дороже примерно тогда же, когда вырос размер файла сейва — в первую очередь проверьте, не автосейв ли создаёт периодические просадки, прежде чем разбирать всю фабрику в поисках виновника.
Сколько CPU и RAM закладывать по мере роста
Требования Factorio к железу растут неравномерно: память — довольно предсказуемо вместе с размером сейва и исследованной картой, а вот процессор — куда резче, потому что стоимость тика зависит не от количества часов игры, а от плотности и сложности производственных цепочек.
| Стадия базы | RAM | CPU | Комментарий |
|---|---|---|---|
| Старт, ранняя автоматизация | 2 ГБ | 1-2 vCPU | Базовая добыча и первые линии сборки — почти любое современное железо тянет с запасом. |
| Средняя фабрика, сотни лент и десяток составов | 4 ГБ | 2 vCPU с высокой тактовой частотой | Ядро, обрабатывающее основной тик, начинает быть узким местом раньше, чем память. |
| Крупная фабрика / мегабаза, тяжёлые моды | 8 ГБ и выше | Максимально высокая частота одного ядра, доступная на тарифе | Здесь важнее взять тариф с быстрым процессором, а не с большим числом ядер. |
Ориентируйтесь на эти цифры как на общую канву, а не жёсткий норматив — фабрика с упором в поезда и минимум лент может держать заметно больший масштаб на тех же ресурсах, чем сравнимая по «часам игры» база с калькуляторами на комбинаторах.
Отдельно учитывайте моды: сборки, сильно усложняющие производственные цепочки (больше промежуточных продуктов, типов сырья, механик симуляции) — закладывайте под них запас по CPU заранее, а не когда тик уже начал проседать. Что и как ставить на сервер, разобрано в статье про моды для Factorio и их установку — там же нюанс про сверку версий модов между сервером и клиентами.
Практические приёмы снижения нагрузки
Когда причина понятна (по разбивке в F4 или по бенчмарку), вот с чего обычно начинают разбор конкретной фабрики:
- Сжимайте ленты, а не растягивайте. Забитая под завязку лента с предметами, стоящими плотно друг к другу, дешевле для симуляции, чем та же лента с редким потоком вразнобой — банальная балансировка производства под реальный спрос снижает нагрузку почти бесплатно.
- Пересматривайте архитектуру доставки на масштабе. Там, где десятки метров лент заменяются одним составом с достаточной пропускной способностью, суммарная стоимость обычно падает — особенно на мегабазах.
- Не плодите избыточные схемы на комбинаторах. Если задачу можно решить проще — двумя-тремя комбинаторами вместо развесистой схемы на полсотни — это прямая экономия тика без потери функциональности.
- Балансируйте войну с биттерами. Если карта не про PvE-конфликт, а исключительно про производство — можно ослабить настройки эволюции/агрессии ещё на этапе генерации карты, снизив постоянную фоновую нагрузку от ИИ врагов.
- Не разгоняйте сеть роботов сверх необходимого. Огромный флот ботов, постоянно в движении, а не простаивающий у роборта в ожидании задач, стоит дороже, чем кажется на глаз — достаточное покрытие меньшим их числом иногда работает не медленнее для игроков, но заметно легче для тика.
- Регулярно чистите забытое. Брошенные черновики построек, разбросанный дроп после боёв с биттерами, неиспользуемые куски инфраструктуры — раз в несколько игровых недель стоит пройтись и убрать явный мусор.
Если после всех этих шагов бенчмарк всё равно показывает стабильно высокую стоимость тика в часы пиковой игры — это уже честный сигнал, что дело в объективной сложности производства, а не в кривом конфиге, и время смотреть в сторону более быстрого по тактовой частоте тарифа. Общие принципы подготовки сервера к росту нагрузки, применимые не только к Factorio, разобраны в статье про оптимизацию сервера под высокую нагрузку.
Поднять сервер Factorio за пару минут
Готовый образ MAATRIX GAMES: NVMe, AMD EPYC, DDoS-защита, панель управления. Локации UK, US, RU. Оплата картой РФ, СБП или криптой.
Создать серверЧастые вопросы
Поможет ли апгрейд на тариф с большим числом ядер?
Почти нет, если проблема в основном тике симуляции — он однопоточный, лишние ядра будут простаивать. Помогает тариф с более быстрым одним ядром, а не с большим их количеством.
Можно ли ограничить рост базы искусственно?
Жёстко лимитировать число сущностей штатными средствами не выйдет, но осознанная архитектура (составы вместо лент на масштабе, компактные схемы на комбинаторах, умеренная сеть биттеров) даёт похожий эффект без искусственных потолков.
Автосейв точно не вызывает лаги сам по себе?
Может вносить свой вклад на очень крупных сейвах — фоновая запись на диск идёт параллельно с симуляцией. Если просадки совпадают по времени с автосейвом — увеличьте autosave_interval и проверьте, стало ли легче.
Моды всегда снижают UPS?
Не обязательно, но многие популярные крупные сборки, усложняющие цепочки, объективно добавляют вычислительной работы на тик — плата за более глубокий геймплей, которую стоит закладывать в план по железу заранее.
Стоит ли переходить в мирный режим, если фабрика — главное, а не бои?
Если оборона от биттеров не входит в планы, ослабление их агрессии ещё на этапе генерации карты снимает постоянный фоновый вклад ИИ-пересчёта в нагрузку.