MAATRIX GAMES / Блог / DayZ: десинхронизация лута между игроками

DayZ: десинхронизация лута между игроками

MAATRIX GAMES

Классическая жалоба в чате DayZ-сервера: "я поднял рюкзак, а у друга он до сих пор лежит на земле" — или ещё веселее, предмет внезапно появляется в двух инвентарях сразу. Это не глюк клиента и не читер балуется, а десинк лута — рассинхронизация состояния предметов между сервером и разными игроками. Разберём, откуда он берётся технически, почему онлайн и просевший серверный FPS напрямую в этом виноваты, и что реально можно сделать администратору, а не просто ждать патча от Bohemia.

Что такое десинк лута и чем он отличается от обычной пропажи

Важно сразу развести два разных явления, которые игроки обычно сваливают в одну кучу под ярлык "лут глючит".

Десинк — это когда состояние предмета на сервере и в клиенте разных игроков реально расходится: один видит вещь в рюкзаке, другой — ту же вещь на земле там, где она лежала пять минут назад. Причина всегда сетевая или связана с обработкой сохранений — сервер не успел или не смог корректно разослать/зафиксировать изменение состояния.

Обычная пропажа — это чаще всего не баг, а механика: время деспавна (CleanupLifetime в globals.xml), лимит nominal/min в types.xml, который заставляет систему подчищать лишнее, или банально предмет утонул в текстуре ландшафта (известная проблема с физикой на некоторых картах). Такие пропажи выглядят пугающе похоже на десинк, но лечатся совсем другими настройками — тюнингом экономики лута, а не сетью и рестартами.

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

Как DayZ хранит состояние предметов и почему тут есть окно для ошибки

DayZ — не игра "с реальным временем сохранения". Сервер держит всё активное состояние мира (позиции предметов, содержимое контейнеров, инвентари игроков) в памяти и периодически сбрасывает его на диск в файлы персистентности — по умолчанию это storage_1.bin в папке миссии, рядом с mpmissions/dayzOffline.chernarusplus/storage_1/ (путь зависит от карты и версии миссии). Между этими сбросами всё живёт только в оперативной памяти процесса DayZServer.

Это и есть корень десинка лута: если между двумя сохранениями произошло что-то нештатное — краш процесса, OOM-килл от нехватки RAM, жёсткий kill вместо аккуратной остановки — сервер откатывается к последнему сохранённому состоянию на диске. Всё, что случилось после этого момента (подобрал предмет, переложил в тайник, скрафтил что-то), теряется или дублируется, потому что клиент уже успел показать игроку изменённое состояние, а сервер о нём "не узнал".

Параметр storageAutoFix в serverDZ.cfg частично страхует от повреждения самого файла хранения:

storageAutoFix = 1;

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

Поднять сервер DayZ за пару минут

Готовый образ MAATRIX GAMES: NVMe, AMD EPYC, DDoS-защита, панель управления. Локации UK, US, RU. Оплата картой РФ, СБП или криптой.

Создать сервер

Типичные сценарии: где именно дюпается и пропадает лут

На практике десинк лута почти всегда укладывается в несколько повторяющихся сценариев:

  • Подбор предмета прямо перед крашем или рестартом. Игрок поднял вещь, клиент её отрисовал в инвентаре, но сервер упал или ушёл в плановый рестарт за секунды до очередного сохранения — при следующем старте предмет "возвращается" туда, где лежал раньше, а у игрока в инвентаре при этом может остаться его клиентская копия до первого честного обновления состояния.
  • Общие контейнеры под нагрузкой. Тайники, бочки, багажники машин и палатки — самое частое место дюпа, потому что несколько игроков одновременно лезут в один и тот же объект. Если два клиента почти синхронно кладут или забирают вещи из одного контейнера, а сервер обрабатывает эти операции с небольшой задержкой — окно рассинхрона увеличивается.
  • Транспорт при обрыве соединения. Машина с грузом в багажнике десинкается заметно чаще палатки — на неё завязано ещё и физическое состояние (позиция, повреждения), которое тоже реплицируется отдельно от содержимого инвентаря.
  • "Призрачный" лут после лагов сети. Предмет визуально виден одному игроку, но не подбирается — потому что клиент отрисовал объект из устаревшего пакета данных, а по факту сервер его уже удалил или переместил.

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

Высокий онлайн: почему на заполненном сервере лут сыпется чаще

Десинк лута растёт нелинейно с ростом одновременного онлайна, и дело не в том, что каждый игрок сам по себе "тяжёлый" — а в том, что каждый добавляет свою долю операций с инвентарём и контейнерами, которые серверу нужно обработать и разослать всем, кто рядом. На пустом сервере с 5 игроками окно рассинхрона между действием и подтверждением от сервера почти незаметно. На заполненном сервере на 60 слотов, где десятки людей одновременно шарятся по военным базам и общим тайникам, очередь сетевых и логических операций растёт, и то самое узкое окно из предыдущего раздела становится шире просто из-за очереди задач на процессоре сервера.

Здесь работает та же логика, что и в десинке существ на других survival-серверах — механика другая, а причина по сути одна: сервер не успевает разослать актуальное состояние объекта всем клиентам одинаково быстро. Похожий разбор для другого движка — в статье про десинк между игроками на ARK-сервере.

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

Серверный FPS: недооценённый показатель стабильности лута

В DayZ есть отдельная метрика — серверный FPS (частота кадров симуляции самого процесса DayZServer, а не картинки на экране игрока). Это не то же самое, что пинг или клиентский FPS: серверный FPS показывает, насколько быстро сам процесс успевает обсчитывать логику мира, включая обработку инвентарных операций и запись в персистентность.

Посмотреть его можно через RCON-консоль, если используете BEC (BattlEye Extended Controls) или подключаетесь напрямую к серверу:

#monitor 1

Команда включает вывод диагностики нагрузки в консоль сервера — по нему видно, насколько стабильно держится частота обсчёта тиков. Также значение попадает в RPT-лог сервера (*.RPT файлы в папке профиля), где можно ретроспективно посмотреть, не проседал ли FPS в момент жалоб на лут.

Связь простая и прямая: чем ниже серверный FPS, тем медленнее сервер успевает обрабатывать очередь операций с предметами и тем реже он успевает сбрасывать состояние в персистентность вовремя. Просевший FPS — это буквально то самое "узкое окно рассинхрона" из предыдущих разделов, растянутое во времени. Просадка серверного FPS ниже комфортного значения на заполненном сервере с тяжёлыми модами (особенно с крупными картами вроде Namalsk или Deer Isle) — частая скрытая причина десинка, которую администраторы не проверяют, списывая всё на "баги игры".

Что обычно роняет серверный FPS:

  • перегруженная модовая сборка с тяжёлыми скриптовыми модами (особенно с кастомной экономикой или AI-модами);
  • раздутая база предметов на карте из-за неверно настроенных nominal/min в types.xml;
  • недостаточный CPU-ресурс тарифа относительно заявленного онлайна — DayZ Server слабо параллелится по ядрам, поэтому важнее частота, а не их количество.

Плановый рестарт по расписанию как частичное решение

Раз десинк лута напрямую связан с накопленной нагрузкой и окном между сохранениями персистентности — регулярный плановый рестарт реально снижает его частоту, хотя и не устраняет причину полностью. Механика простая: рестарт форсированно сбрасывает актуальное состояние в storage_1.bin, очищает накопившиеся в памяти артефакты долгой сессии (утечки, разросшийся список объектов) и даёт серверному FPS "свежий старт" без деградации, накопленной за часы аптайма.

Практика для DayZ-серверов — рестарт каждые 4-6 часов, а не раз в сутки, как на некоторых других играх: экономика лута DayZ и так завязана на регулярный респавн предметов через types.xml, и рестарт заодно помогает этому циклу работать предсказуемо.

Настраивается это через cron и graceful shutdown — подробная рабочая схема с предупреждением игроков и автозапуском через systemd есть в статье про автоматический рестарт сервера по расписанию. Для DayZ важно, чтобы shutdown был именно "мягким" — через RCON-команду, а не kill -9 процесса, иначе рискуете получить тот самый краш посреди записи персистентности, который и провоцирует дюп.

Мягкая остановка через RCON:

#shutdown

Честно говоря: рестарт — это не лечение причины, а управление симптомом. Он не устранит десинк как явление (это особенность архитектуры персистентности DayZ, а не баг конкретно вашего сервера), но заметно сократит число повреждённых сохранений и накопленной деградации, из-за которых десинк лута усиливается со временем.

Что ещё можно настроить: снижаем накопленную нагрузку

Кроме рестартов, есть несколько практических рычагов, которые снижают частоту десинка лута, не требуя менять железо:

  • CleanupLifetime в globals.xml — время жизни брошенных предметов и транспорта. Слишком большие значения раздувают число активных объектов на карте, каждый из которых сервер держит в памяти и учитывает при репликации — это косвенно роняет серверный FPS.
  • Ревизия types.xml — если nominal/min завышены "чтобы всем всего хватало", на карте одновременно живёт больше предметов, чем сервер комфортно тянет при вашем онлайне. Снижение этих значений — не только вопрос баланса экономики, но и разгрузка сервера.
  • Модерация тайников и палаток — заброшенные хранилища неактивных игроков со временем превращаются в те самые перегруженные контейнеры, где чаще всего дюпится лут при одновременном доступе. Регулярная чистка снижает и число объектов, и вероятность конфликтов.
  • Достаточный запас RAM и CPU под реальный, а не номинальный онлайн — если сервер работает на пределе ресурсов при заполненности, десинк будет возвращаться после каждого рестарта в течение пары часов, как только онлайн снова вырастет.

Ни одна из этих мер не работает в одиночку — но вместе они заметно сужают окно рассинхрона, из-за которого лут дюпается и пропадает.

Поднять сервер DayZ за пару минут

Готовый образ MAATRIX GAMES: NVMe, AMD EPYC, DDoS-защита, панель управления. Локации UK, US, RU. Оплата картой РФ, СБП или криптой.

Создать сервер

Частые вопросы

Можно ли полностью избавиться от десинка лута на DayZ-сервере?

Реалистично — нет, если сервер активный и заполненный. Это архитектурная особенность персистентности DayZ, а не баг конкретно вашей настройки. Можно заметно снизить частоту через рестарты, ревизию types.xml/globals.xml и достаточные ресурсы, но полностью исключить при высокой нагрузке не получится.

Помогает ли SSD/NVMe против десинка лута?

Косвенно. Быстрый диск ускоряет саму запись в storage_1.bin, что немного сокращает окно рассинхрона, но не решает первопричину — недостаток CPU или сетевые задержки решают вопрос куда сильнее, чем скорость диска.

Почему после планового рестарта лут иногда всё равно теряется?

Если shutdown был не мягким (например, сервер убили по таймауту вместо ожидания корректной остановки через RCON), персистентность может не успеть записаться полностью — это создаёт ровно ту же проблему, от которой рестарт должен защищать. Проверьте, что скрипт остановки ждёт завершения процесса, а не просто отправляет kill.

Как понять, что причина именно в серверном FPS, а не в чём-то другом?

Включите #monitor 1 через RCON или посмотрите RPT-логи в моменты жалоб игроков. Если просадки FPS совпадают по времени с всплеском жалоб на дюп или пропажу лута — это довольно надёжный признак именно такой причины.

Влияют ли моды на десинк лута?

Да, особенно моды с кастомной экономикой, тяжёлым AI или большими картами вроде Namalsk и Deer Isle — они добавляют нагрузку на симуляцию, что снижает серверный FPS и расширяет окно рассинхрона. Ставите такую сборку — закладывайте запас по CPU заранее.