RE:NODE

Руководства10 мин чтения

MLO и карты в FiveM без лагов

Как работают MLO, правки карты и стриминговые ассеты в FiveM: папка stream, строки ytyp и fxmanifest, предупреждения oversized assets, конфликты и размер загрузки.

0 прочтений

MLO - это пользовательский интерьер для GTA V: комнаты, порталы и пропы внутри них, - и в FiveM он устанавливается как любой другой ресурс: папка с fxmanifest.lua и папкой stream, где лежат файлы моделей, текстур и коллизий. Каждый файл в папке stream скачивает каждый игрок, который заходит на сервер, и каждый файл загружается в память клиента, когда игрок оказывается рядом с ним. Отсюда два правила, от которых зависит, хорошо ли работает сервер с большим количеством карт: держите отдельные ассеты достаточно маленькими, чтобы FXServer о них не предупреждал, и держите общий объём достаточно маленьким, чтобы первые входы и память под текстуры оставались в разумных пределах. В этом руководстве - как работает стриминг, какие строки манифеста нужны MLO, типы файлов, конфликты между картами и как урезать раздутый пак ассетов.

Как работает стриминг в FiveM#

GTA V загружает мир по частям по мере вашего движения, из архивов на диске. FiveM добавляет поверх этого слой: ресурсы могут поставлять дополнительные файлы, которые клиент регистрирует так, будто они часть собственных архивов игры. Это и есть стриминговые ассеты.

  • Любой файл внутри папки stream в ресурсе автоматически регистрируется для стриминга. Подпапки внутри stream допустимы и помогают навести порядок.
  • При первом входе клиент скачивает все стриминговые файлы с HTTP-точки сервера на TCP 30120 и сохраняет их в локальный кэш. При следующих входах скачиваются только изменившиеся файлы.
  • Стриминг работает по имени файла. Файл v_ilev_door.ydr в вашем ресурсе заменяет одноимённый файл игры. Два ресурса, стримящие файлы с одинаковым именем, конфликтуют, и один из них молча проигрывает.
  • Клиент загружает стриминговые ассеты в память, когда игрок приближается к чему-то, что их использует, ровно так же, как для базовой игры.

Так что стриминговые ассеты стоят трёх вещей: дискового пространства и трафика сервера на загрузки, времени загрузки у клиента при первом входе и памяти клиента во время игры. CPU сервера они почти не стоят. Пак карт не делает тики сервера медленнее; он делает вход медленнее и может привести к тому, что игра не загрузит текстуры в оживлённом районе.

Типы файлов, которые вы встретите#

РасширениеЧто содержит
.ymapРасстановку: какие объекты где стоят в мире
.ytypОпределения архетипов, включая интерьеры MLO и их комнаты
.ydrОдну отрисовываемую модель
.yddСловарь моделей, часто одежда или пропы
.ytdСловарь текстур
.ybnГраницы коллизий
.yftФрагментные модели, например машины и разрушаемые объекты
.ycdАнимационные клипы

Пак MLO обычно состоит из .ytyp, который определяет интерьер, .ymap, который размещает его в мире, файлов .ydr и .ytd для оболочки и пропов и файлов .ybn для коллизий. Правка карты, которая только добавляет пропы снаружи, может быть всего лишь .ymap и несколькими моделями. Машины - отдельная тема со своими meta-файлами, ей посвящена статья о машинах и addon-авто в FiveM.

Для создания и просмотра этих файлов используют CodeWalker для просмотра и расстановки, OpenIV для обзора архивов игры и дополнение Sollumz для Blender для моделирования. Чтобы установить готовый MLO, ничего из этого не нужно, но CodeWalker стоит иметь под рукой для диагностики конфликтов.

Установка MLO#

Типичный ресурс MLO выглядит так:

code
resources/  [maps]/    cfx_pillbox_hospital/      fxmanifest.lua      stream/        pillbox_shell.ydr        pillbox_shell.ytd        pillbox_col.ybn        pillbox.ytyp        pillbox_mlo.ymap
fxmanifest.lua
fx_version 'cerulean'game 'gta5'this_is_a_map 'yes'data_file 'DLC_ITYP_REQUEST' 'stream/pillbox.ytyp'

this_is_a_map 'yes' помечает ресурс как картографический контент, чтобы клиент соответствующим образом обращался с его стриминговыми файлами. Строка DLC_ITYP_REQUEST регистрирует файл архетипов, который определяет интерьер; большинство паков MLO её содержат, и её стоит оставлять даже там, где .ytyp загрузился бы и без неё. Некоторые паки также поставляют interiorproxies.meta, который регистрируется так:

lua
files { 'interiorproxies.meta' }data_file 'INTERIOR_PROXY_ORDER_FILE' 'interiorproxies.meta'

Затем добавьте ресурс в server.cfg:

config
ensure cfx_pillbox_hospital

Папки в квадратных скобках вроде [maps] - это контейнеры, а не ресурсы, поэтому в строке ensure указывается только имя ресурса. Новую папку, добавленную во время работы сервера, ensure найдёт только после refresh в консоли. Порядок ensure и остальной файл разобраны в статье о server.cfg в FiveM.

Предупреждение об oversized assets#

FXServer проверяет стриминговые файлы при запуске и предупреждает о тех, что займут слишком много памяти на клиенте:

code
Asset pillbox_shell.ytd uses 38.0 MiB of physical memory. Oversized assets can and WILLlead to streaming issues (such as models not loading/rendering).

Порог - 16 MiB физической памяти на ассет. Предупреждение означает ровно то, что в нём написано: система стриминга игры строилась под ассеты гораздо меньше этого, и один словарь текстур на 38 MiB конкурирует со всем остальным, что клиент пытается загрузить поблизости. Симптомы - текстуры, которые остаются размытыми, здания, которые появляются с опозданием, а в тяжёлых случаях - части города вокруг раздутого ассета, которые не загружаются вообще.

Почти всегда причина в текстурах. Автор экспортировал текстуры 4096 на 4096 для поверхностей, которые игрок видит с трёх метров, или оставил несжатые форматы. Исправление - открыть .ytd, уменьшить большие текстуры до 2048 или 1024, сохранить их в сжатом формате и проверить, что ничего видимого не стало хуже. На типичном перегруженном MLO это вдвое уменьшает размер, и в игре никто этого не замечает. Если трогать файлы самому не хочется, предупреждение - справедливый повод вернуть ассет автору: платный MLO, который поставляется с несколькими раздутыми ассетами, имеет проблемы с качеством.

Не исправляйте это удалением низкодетализированных версий моделей (LOD), как советуют некоторые руководства ради экономии места. LOD - это то, что игра рисует на расстоянии; без них объекты возникают из ниоткуда.

Общий размер и первые входы#

Того, что каждый ассет проходит проверку размера, недостаточно. Каждый новый игрок скачивает всё целиком, а клиент держит в памяти текстуры всего, что находится рядом, одновременно. Сервер с сорока MLO и тремя сотнями машин может заставить нового игрока скачать несколько гигабайт, прежде чем тот увидит меню персонажа.

Что действительно помогает, в порядке отдачи:

  1. Удалите то, чем никто не пользуется. Интерьеры для работ, которые у вас больше не идут, второй полицейский участок со старой карты, тестовые пропы. Каждый неиспользуемый ресурс всё равно скачивается.
  2. Уменьшите самые большие текстуры. Отсортируйте папки stream по размеру и начните сверху: десять самых больших файлов обычно и составляют большую часть проблемы.
  3. Избегайте дубликатов. Два пака карт, которые оба поставляют одни и те же пропы под разными именами, удваивают загрузку. Два, которые поставляют их под одинаковыми именами, вместо этого конфликтуют, а это хуже.
  4. Предупредите игроков. Экран загрузки, где сказано, что первый вход скачивает большой объём, лучше, чем канал поддержки, полный людей, которые думают, что сервер завис.

Игроки тоже могут помочь со своей стороны: в настройках недавних клиентов FiveM есть опция расширенного бюджета текстур, которая даёт стриминговым текстурам больше места на машинах с достаточным объёмом видеопамяти. Это обходной путь, а не повод перестать урезать.

На стороне сервера ассеты раздаются с диска через TCP-точку. Быстрое хранилище ускоряет серверную половину этого процесса, а остальное - это соединение самого игрока. На RE:NODE каждый тариф работает на NVMe, а трафик не тарифицируется, то есть с вас не берут плату за гигабайт - но это не приглашение заставлять каждого нового игрока скачивать пять гигабайт, а соединение игрока в любом случае остаётся самым медленным звеном. Что это значит на практике, описано в статье о трафике и fair use.

Конфликты между картами#

Два картографических ресурса могут столкнуться тремя способами, и в игре каждый выглядит по-своему.

Одно и то же место. Два MLO, размещённые в одном пространстве, - скажем, две разные версии полицейского участка Mission Row, - накладываются друг на друга. Игроки видят стены сквозь стены, проваливаются сквозь пол там, где коллизия одного интерьера не совпадает с моделью другого, или находят двери, которые открываются в пустоту. Один интерьер на одно место; второй удалите.

Одинаковое имя файла. Стриминг работает по имени файла, поэтому два ресурса, поставляющих prop_desk_01.ydr с разным содержимым, конфликтуют. Какой победит, зависит от порядка загрузки, и после рестарта это может измениться. Переименуйте файл с одной стороны или удалите дубликат.

Стандартные интерьеры и загрузчики IPL. Ресурсы вроде bob74_ipl загружают интерьеры GTA Online и их варианты. MLO, который заменяет один из этих интерьеров, борется с загрузчиком. Устанавливая замену, отключите этот интерьер в конфигурации загрузчика.

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

Интерьеры в игре: entity sets, коллизии и телепорты#

У многих MLO есть необязательные части, называемые entity sets: разные варианты расстановки мебели, повреждённая и целая версия, дополнительные комнаты, - и включаются они из скрипта:

lua
-- client sidelocal interior = GetInteriorAtCoords(311.0, -594.0, 43.0)ActivateInteriorEntitySet(interior, "pillbox_reception")RefreshInterior(interior)

Названия entity sets указаны в документации MLO. Пока что-нибудь их не активирует, ничего не отображается, - вот почему после установки интерьер может выглядеть пустым.

Провал сквозь пол после телепорта в интерьер - это проблема тайминга коллизий, а не сломанный MLO. Игрок появляется раньше, чем загрузилась коллизия для этой точки. Скрипты телепорта должны запрашивать коллизию и ждать её:

lua
RequestCollisionAtCoord(x, y, z)while not HasCollisionLoadedAroundEntity(PlayerPedId()) do    Wait(0)end

Если игроки проваливаются сквозь пол, когда просто входят пешком, значит, .ybn отсутствует, повреждён или конфликтует с другой картой.

Важна и сборка игры. MLO, созданный с пропами из недавнего обновления GTA Online, работает только если сервер требует как минимум эту сборку через sv_enforceGameBuild. Автор должен указать, какая сборка нужна MLO; если в игре не хватает пропов, проверьте это в первую очередь.

Как держать сервер с большим количеством карт под контролем#

Большие серверы в итоге обрастают десятками картографических ресурсов. Несколько привычек не дают этому превратиться в загадку:

  • Одна папка на одно назначение. [maps] для MLO, [vehicles] для машин, [props] для мелких дополнений. Проще делить пополам, проще измерять.
  • Список того, для чего каждая карта. Какая работа её использует, кто её купил, где, какая сборка ей нужна. Когда у автора меняется аккаунт или переезжает лицензия, это понадобится.
  • Измеряйте до и после. Записывайте общий размер папок stream, когда добавляете пак, чтобы знать, во что каждое добавление обходится новым игрокам.
  • Делайте backup ресурсов, а не только базы данных. Платный MLO, который больше нельзя скачать, пропадёт, если пропадёт папка. Статья о бэкапах, которые действительно восстанавливаются относится к этому не меньше, чем к базе данных.

На RE:NODE можно перетащить целый картографический ресурс в файловый менеджер, и архивы распаковываются на месте, а большой пак можно загрузить по SFTP; данные для подключения - в статье о SFTP и файловом менеджере. Бэкапы запускаются из панели, их можно ставить по расписанию, и хранятся они вне машины.

Устранение неполадок#

«Oversized assets can and WILL lead to streaming issues». Ассет больше 16 MiB физической памяти, обычно словарь текстур. Уменьшите его текстуры или попросите об этом автора.

Интерьер невидим или пуст. Не хватает строки DLC_ITYP_REQUEST, ресурс не запущен или его entity sets не активированы.

Игроки проваливаются сквозь пол. Коллизия ещё не загрузилась после телепорта, либо .ybn отсутствует или конфликтует.

Текстуры в одном районе остаются размытыми. Рядом с этим местом слишком много стримингового контента для бюджета текстур клиента. Уменьшите текстуры в ближайших паках.

Два здания в одном месте. Две карты в одной точке или MLO, конфликтующий с загрузчиком IPL. Оставьте что-то одно.

Карта работает у одних игроков и не работает у других. Игроки на старой сборке игры или контент под escrow, привязанный к ключу, который сменился. Проверьте sv_enforceGameBuild и консоль на ошибки прав доступа.

FAQ#

Что такое MLO в FiveM?

Пользовательский интерьер: набор комнат и порталов, определённых в файле .ytyp и размещённых в мире через .ymap, со своими моделями, текстурами и коллизиями. Он устанавливается как ресурс с папкой stream, как и любой другой картографический контент.

Вызывают ли MLO лаги на сервере FiveM?

Не на сервере: стриминговые файлы раздаются с диска и почти не тратят CPU. Они нагружают клиента: время загрузки при первом входе и память во время игры. Раздутые ассеты приводят к пропавшим текстурам и медленной загрузке, и игроки часто называют это лагами.

Какой лимит у стримингового ассета?

FXServer предупреждает о любом ассете больше 16 MiB физической памяти. Он всё равно загружается, но большие ассеты конкурируют со всем остальным поблизости и вызывают проблемы со стримингом. Держите каждый ассет ниже порога.

Почему две мои карты ломают друг друга?

Либо они занимают одно и то же место, либо стримят файлы с одинаковыми именами, либо MLO заменяет интерьер, который также загружает загрузчик IPL. Удалите одну, переименуйте дубликат или отключите интерьер в загрузчике.

Нужно ли игрокам скачивать карты при каждом входе?

Нет. После первого входа стриминговые файлы кэшируются на машине игрока. Заново скачиваются только файлы, изменившиеся с тех пор, - поэтому обновление большого пака означает ещё один долгий вход для всех.


Комментарии

Полностью анонимно: без аккаунта, без почты, без cookie. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.

0/2000