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

Автор: Nilo3D · Обновлено:

Транспорт FiveM оптимизирован, когда каждому стримящемуся файлу нужно 16 MiB памяти или меньше, у модели есть меши пониженной детализации для дальних расстояний, а vehicles.meta сообщает игре, когда переключаться между ними. На практике это означает текстуры 2048 пикселей или меньше в сжатом формате, четыре уровня LOD ниже высокодетализированного меша и lodDistances вроде 10, 25, 50, 100, 500, 500.

На что ориентироваться?

FiveM не задаёт лимита полигонов. Сервер измеряет память, которая нужна каждому стримящемуся файлу после загрузки, и предупреждает, если она больше 16 MiB на файл. Поэтому цель задаётся на файл, а не на транспорт: .yft, _hi.yft и .ytd проверяются каждый отдельно. Пороги этого предупреждения описаны в гайде о файлах модели транспорта и предупреждении oversized assets.

ФайлЧто делает его тяжёлымЧто делать
.ytdРазрешение и формат текстурУменьшить и сжать текстуры.
_hi.yftЧисло треугольников детального мешаУдалить геометрию, которую никто не видит, упростить плотные части.
.yftЧисло треугольников младших уровней плюс коллизияСделать настоящие младшие LOD вместо копий детального меша.

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

Как измерить транспорт?

  • Консоль сервера. Запустите ресурс и прочитайте консоль. Для каждого файла больше 16 MiB появляется строка с именем файла и его размером в MiB. Если строк нет, все файлы прошли проверку.
  • Треугольники по уровням в Blender. В Sollumz Tools > Drawables > LOD Tools > Auto LOD выберите Drawable Model, и панель покажет LOD Statistics: треугольники и вершины каждого уровня, у которого есть меш.
  • Текстуры. Память текстуры зависит только от разрешения и формата. Таблица есть в гайде о файлах модели: текстура 2048 x 2048 в DXT5 занимает 5.33 MiB, а 4096 занимает 21.3 MiB.

Какие уровни LOD есть у транспорта?

Sollumz даёт каждому Drawable Model пять слотов. При экспорте верхний становится _hi.yft, а остальные четыре попадают в основной .yft.

Уровень SollumzФайлЗначение lodDistances, которое его завершаетСтоковый Sultan
Very High_hi.yft1-е10 м
High.yft2-е25 м
Medium.yft3-е50 м
Low.yft4-е100 м
Very Low.yft5-е500 м

Шестое значение задаёт расстояние, на котором транспорт перестаёт отрисовываться. Дистанции хранятся в vehicles.meta, а не в модели:

<!-- _hi, High, Medium, Low, Very Low, fade out (metres) -->
<lodDistances content="float_array">
  10.000000
  25.000000
  50.000000
  100.000000
  500.000000
  500.000000
</lodDistances>

Стоковый скутер Faggio использует 15, 30, 50, 100, 500, 500. Ошибка, которую мы встречали в конвертированных машинах: строка вроде 10, 150, 150, 150, 150, 150. Меш High рисуется до 150 м, а затем машина исчезает, поэтому младшие уровни никогда не показываются, даже если они есть в модели. Поле объясняется в разборе vehicles.meta, а что такое LOD, рассказано в гайде о LOD в транспорте FiveM.

Как создать LOD в Sollumz?

Откройте Sollumz Tools > Drawables > LOD Tools > Auto LOD. Инструмент копирует образцовый меш и упрощает его для каждого отмеченного уровня, затем Generate LODs заполняет слоты.

НастройкаПо умолчаниюЗначение
Reference MeshМеш, который копируется и упрощается. Берите самый детальный.
MethodCollapseCollapse подходит для общего случая. Un-Subdivide подходит для мешей, созданных подразделением, Planar растворяет плоские участки.
Decimate Step0.6Один общий шаг, применяемый для каждого уровня.
Per-LOD RatiosВыкл.Если включено, у каждого уровня свой коэффициент. По умолчанию это 0.90, 0.70, 0.50, 0.30 и 0.15 от Very High до Very Low, а вместо коэффициента уровню можно задать целевое число треугольников.
Decimate from OriginalВыкл.Упрощать каждый уровень от образца, а не от уровня выше.

Автоматическое упрощение служит отправной точкой. Что мы потом проверяем вручную:

  • Свет. Мелкие светящиеся части схлопываются первыми и исчезают. Оставляйте для поворотников и задних фонарей исходный меш на каждом уровне или защищайте их от упрощения.
  • Части на разных костях. Упрощайте каждую модель отдельно, чтобы у двери никогда не было общей вершины с кузовом.
  • Силуэт. Самый младший уровень должен выглядеть правильно только со 100 м и дальше. Салон, двигатель и днище можно убрать полностью.
  • Колёса мотоциклов. На двухколёсном транспорте, который мы делали, игра не рисовала отдельную модель колеса на самом младшем уровне. Стоковые мотоциклы решают это простой формой колеса внутри меша кузова этого уровня, и мы делаем так же.

Какие размеры текстур использовать для транспорта?

Вот размеры, которые мы используем по ролям. Никогда не увеличивайте текстуры: текстура, которая пришла в 1024, остаётся в 1024.

ТекстураРазмер
Ливрея, основной атлас, рассеиватели фар2048
Карта нормалей кузова, шина1024
Повторяющиеся детальные текстуры (карбон, ткань, решётки)512
Мелкие детали салона256
Сплошные цвета4 x 4
  • Формат. DXT1 (BC1) без прозрачности, DXT5 (BC3) с прозрачностью. Текстура в DXT1 занимает вдвое меньше памяти, чем та же текстура в DXT5.
  • Сплошные цвета. Сохраняйте одноцветные текстуры 4 x 4 без сжатия. Они почти ничего не стоят, а блочное сжатие сдвигало наши тёмно-серые цвета в фиолетовый и зелёный.
  • Общие текстуры. Картам specular, normal и грязи, которые уже есть в общих текстурах транспорта игры, копия в вашем .ytd не нужна.
  • Неиспользуемые текстуры. В конвертированных моделях есть текстуры, которые не использует ни один материал. Удалите их.
  • Конвертируйте вне Blender. Уменьшайте и сжимайте текстуры в отдельной программе и загружайте результат. Пересохранение изображений из Blender затемняло наши текстуры.

Можно ли оптимизировать уже готовый транспорт?

Да, из исходного файла. Откройте .blend, из которого транспорт был экспортирован, добавьте младшие уровни и экспортируйте заново. Чего мы избегаем: импортировать готовый .yft в Blender и экспортировать обратно. Такой круг переписывал мелкие значения в скелете, и на одном нашем транспорте этого хватило, чтобы сломать анимации посадки и выхода в игре.

Текстуры менять постфактум безопаснее. .ytd можно открыть, заменить его текстуры на меньшие с теми же именами и сохранить, не трогая модель. Инструменты для каждой задачи описаны в гайде CodeWalker или Sollumz.

Чек-лист оптимизации

  1. Нет текстур больше 2048 и нет несжатых, кроме цветов 4 x 4.
  2. В .ytd нет неиспользуемых текстур.
  3. У модели есть меш Very High и четыре младших уровня.
  4. Свет по-прежнему виден на каждом уровне.
  5. В lodDistances шесть возрастающих значений, а не одно и то же число несколько раз.
  6. Консоль сервера не выводит строку о размере для этого ресурса.

Весь процесс моделирования описан в гайде о создании транспорта FiveM в Blender с Sollumz. Пример из нашего каталога: Coil S-Cooter и три ховерборда поставляются с четырьмя LOD, от High до Very Low.

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

Сколько полигонов должно быть у машины FiveM?
FiveM не задаёт лимита полигонов. Сервер измеряет память каждого стримящегося файла и предупреждает выше 16 MiB, поэтому практический предел такой: .yft и _hi.yft, каждый из которых занимает не больше этого размера.
Какие lodDistances использовать для аддон-машины?
Стоковый Sultan использует 10, 25, 50, 100, 500, 500, и с этого безопасно начинать. Каждое значение завершает один уровень: _hi, High, Medium, Low, Very Low, затем исчезновение.
Как сделать LOD в Sollumz?
Используйте Sollumz Tools > Drawables > LOD Tools > Auto LOD. Выберите образцовый меш, отметьте уровни, которые нужно создать, и нажмите Generate LODs. Затем проверьте свет и силуэт вручную.
Какой размер текстур лучше для транспорта FiveM?
Мы используем 2048 для ливреи или основного атласа, 1024 для карты нормалей кузова и шин, 512 для повторяющихся деталей и 256 для мелких деталей салона, всё в DXT1 или DXT5.
Учитывается ли _hi.yft в проверке 16 MiB?
Каждый файл проверяется отдельно. .yft, _hi.yft и .ytd должны каждый занимать не больше 16 MiB, чтобы консоль молчала.

Источники

Товары из гайда

Все гайды