НАЖМИ, чтобы запустить свой Сервер Майнкрафт + 8🎁
modМоды/Structure Layout Optimizer
Structure Layout Optimizer

Structure Layout Optimizer

Мод Structure Layout Optimizer ускоряет генерацию Jigsaw-структур и NBT-файлов в Майнкрафт. Внешний вид построек не меняется, а спайки TPS при подгрузке деревень, крепостей и данжей уходят. Fabric, Forge, NeoForge.

Оцените первым
Открыть в FateLauncher
8.5M
394

Structure Layout Optimizer - серверный мод оптимизации для Minecraft, который берёт на себя самую неблагодарную работу: ускоряет генерацию Jigsaw-структур и NBT-фрагментов, не трогая их внешний вид. Скачайте мод Structure Layout Optimizer, и ваши деревни, крепости, данжи из модов и прочие сложные постройки начнут появляться в мире быстрее, без фирменных подлагиваний сервера при подгрузке новых чанков.

Сразу главное: этот мод не перекраивает структуры и не добавляет ничего нового в игру. Его задача - переписать узкие места в коде генерации, чтобы постройки собирались эффективнее. Для игрока это значит одно - меньше микрофризов при исследовании мира, меньше провалов TPS на сервере, когда кто-то летит на элитре через незагруженные чанки. Проект распространяется под лицензией MIT, работает на Fabric, NeoForge и Forge, поддерживает одиночную игру, хотя по факту ориентирован прежде всего на серверы и тяжёлые сборки модов.

Популярность проекта говорит сама за себя: около 29 миллионов загрузок на одном хостинге модов и почти 8 миллионов на другом. Поддержка версий - от Minecraft 1.16.1 и 1.20.1 вплоть до 1.21.4-1.21.11 и новых 26.x веток, актуальные файлы выходят регулярно.

Зачем вообще нужна эта оптимизация

Ванильная генерация структур в Майнкрафт устроена не слишком экономно. Jigsaw-структуры (это почти всё: деревни, бастионы, подводные руины, trial chambers, крепости и любые постройки из модов) собираются по кусочкам через Jigsaw-блоки. И чем больше кусочков, тем дороже каждая проверка "а влезет ли следующий фрагмент без пересечений". В сборке с сотней структурных модов эти проверки превращаются в заметные лагспайки прямо посреди исследования мира. Особенно это больно на серверах: один игрок с элитрой может уронить TPS для всех.

Structure Layout Optimizer переписывает именно эти горячие участки кода. Ниже - что конкретно он делает, простыми словами, но с сохранением сути.

Замена VoxelShape на BoxOctree при проверке пересечений

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

Мод подменяет VoxelShape на заглушку, внутри которой живёт BoxOctree - древовидная структура данных, которая при проверке пересечений смотрит только на соседние куски, а далёкие просто игнорирует. Ведь кусок на другом конце структуры заведомо не может пересечься с новым. В результате время проверки перестаёт раздуваться по мере роста структуры, и рекурсивные Jigsaw-генерации перестают вешать сервер.

Пропуск заведомо заблокированных Jigsaw-блоков

В ваниле каждый Jigsaw-блок родительского фрагмента проверяет каждый Jigsaw-блок дочернего, чтобы понять, можно ли их соединить. Но если Jigsaw-блок родителя упирается в край границы структуры или смотрит на другой уже размещённый фрагмент, то у него физически нет места, чтобы породить жёсткий (rigid) дочерний кусок. Проверять такой блок - чистая трата времени.

Мод научил игру распознавать эту ситуацию и сразу переходить к следующему куску. В структурах с огромным количеством Jigsaw-блоков это экономит массу дорогих сопоставлений.

Ускорение сопоставления Jigsaw-блоков (версии 26.2 и ниже)

Ванильный код дважды дёргает getValue для каждого Jigsaw-блока, чтобы получить верхнее и переднее значения из одного и того же свойства, хотя можно взять его один раз. Мод сокращает количество обращений к свойствам блока вдвое, ускоряет чтение joints, targets и имён из NBT, а также избавляется от неэффективного преобразования данных о соединениях в Enum через byName. Плюс переупорядочены проверки, чтобы меньше логики выполнялось впустую.

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

Быстрая загрузка гигантских NBT-структур

Когда NBT-фрагмент генерируется в чанке, ваниль загружает в память ВЕСЬ фрагмент целиком, потом много раз итерирует по всем позициям ради StructureProcessor'ов, и только потом отбрасывает всё, что не попадает в текущий чанк. Для больших NBT-файлов это откровенно расточительно и даёт долгие загрузки.

Мод делает проверку границ заранее и отрезает ненужные позиции до того, как их увидят StructureProcessor'ы. Есть одно исключение: если StructureProcessor переопределяет метод finalizeProcessing, ему могут понадобиться все позиции целиком, и для таких кусков оптимизация отключается. Таких структур мало - в ваниле это только Trail Ruins с её Capped-процессором.

Оптимизация выбора фрагментов в SinglePoolElement (1.21.1+)

Ваниль дважды читает данные selection_priority из NBT: сначала проверяет тип, потом возвращает значение. Мод берёт запись один раз. Также переписана система сортировки приоритетов - она помогает немногим структурам, реально использующим selection_priority (например, Trial Chambers), но для структур с абсурдным количеством Jigsaw-блоков выигрыш ощутимый.

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

Пропуск уже проверенных фрагментов и конфиг deduplicateShuffledTemplatePoolElementList

Тут вообще интересная история. Ванильный StructureTemplatePool хранит список всех элементов, где фрагмент дублируется столько раз, каков его вес. Указали вес 100 для дома - дом лежит в списке 100 раз. При генерации игра копирует этот список, перемешивает и идёт по нему, пытаясь заспавнить первый подходящий кусок. То есть логика проверки снова и снова прогоняется для дубликатов, даже если этот же кусок уже не влез в текущее место секунду назад.

Мод запоминает, какие фрагменты уже проверены и не подошли, и пропускает их дубликаты. Для структур с высокими весами в пулах шаблонов это даёт хороший прирост производительности.

А если включить опцию deduplicateShuffledTemplatePoolElementList в конфиге, дубликаты убираются из списка совсем, и производительность растёт ещё сильнее. Цена - изменение раскладки структуры. Объясню на пальцах: паритет сидов значит, что на сиде 777 деревня в определённом месте всегда имеет два кузнечных дома. С включённой опцией деревня останется на том же месте, но кузнечных домов может быть один. И при каждом использовании этого сида с включённым конфигом раскладка будет стабильно такой - с одним домом. То есть генерация остаётся валидной и детерминированной, просто отличается от ванильной. Решайте сами, что важнее: бит-в-бит ванильные раскладки или ещё немного FPS и TPS.

Снижение потребления памяти StructureTemplate (Minecraft 1.21.4+ и v1.1.0+)

Для свежих версий в моде появилась оптимизация, вдохновлённая модом Glacier от contaria (автор получил разрешение использовать их код как основу). Суть: каждый загруженный NBT-файл превращается в кешированный объект StructureTemplate, внутри которого лежит список ВСЕХ позиций с блоками и NBT-тегами. Это главный пожиратель памяти среди структурных объектов.

Мод подменяет этот список на компактную палитровую структуру данных, которая притворяется списком. Размер в памяти - заметно меньше. Когда генерации мира нужен полный список, он собирается обратно как WeakReference, отрабатывает, а потом убирается сборщиком мусора. В итоге каждая структура занимает полный объём памяти только в момент генерации, а в долгосрочном кеше хранится в ужатом виде. Ограничение: этот список нельзя модифицировать через add, remove, clear - будет исключение. Автор считает, что таких модов нет, но если ваша сборка вдруг крашится на этом - вы знаете причину.

Совместимость с ModernFix

Отдельно стоит сказать про связку с ModernFix. Там есть миксин, который делает объекты StructureTemplate SoftReference и выгружает их из памяти при её нехватке - это лечит утечку памяти от вечно не очищаемого кеша структур в долгих сессиях. Минус: выгруженный фрагмент придётся заново читать с диска. Эти два подхода не конфликтуют, а дополняют друг друга: Structure Layout Optimizer уменьшает размер StructureTemplate в памяти, поэтому ModernFix может держать больше закешированных структур без выгрузки. Теоретически - больше попаданий в кеш на длинной дистанции игры.

Что со сборками модов и зависимостями

Мод затачивался именно под тяжёлые модпаки, где структурных модов много и генерация мира - главный источник просадок. В сообществах оптимизационных сборок его ставят рядом с C2ME, Noisium и Lithium - это устоявшаяся практика игроков, а не официальная рекомендация автора, но связка действительно рабочая: каждый мод закрывает своё узкое место.

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

Из свежего: в версии 1.1.4 исправлен редкий краш из-за миксина, так что если сталкивались с ним раньше - обновляйтесь смело.

Для серверов: мод клиентам не нужен

Structure Layout Optimizer - серверный мод. Игрокам на сервере устанавливать его не требуется, вся магия происходит на стороне генерации мира. Это делает его идеальным кандидатом для публичного проекта: ставите на сервер и забываете про жалобы на лаги при исследовании.

Если собираете свой проект, удобнее всего арендовать сервер Майнкрафт на BungeeHost (https://bungee.host) - мод установится туда в один клик, и хостинг серверов Майнкрафт с оптимизационными модами вроде этого заметно легче переживает наплыв игроков. Запустить сервер Майнкрафт с тяжёлой сборкой без подобных оптимизаций - значит обречь себя на вечные вопросы "а чего лагает?" в чате.

Кому ставить

  • Владельцам серверов с модами на структуры - обязательно. Это прямо его профиль.
  • Сборщикам модпаков с Yung's Better, Towns and Towers, When Dungeons Arise и подобным - прирост будет заметен.
  • Игрокам в одиночке на ваниле - можно, но эффект скромнее: ванильные структуры не такие тяжёлые, хотя Trial Chambers и крупные руины всё равно скажут спасибо.
  • Перфекционистам сида-в-сид с ванилью - оставьте deduplicateShuffledTemplatePoolElementList выключенным, тогда раскладки структур останутся идентичными.

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

Часто задаваемые вопросы

Совместимость

Платформы

Поддерживаемые окружения

Сервер

Зависимости

Детали

Лицензия:
Опубликован:2 года назад
Обновлён:1 месяц назад

Версии мода Structure Layout Optimizer

Доступно 89 версий. Сначала показаны самые популярные и самые свежие.

16 из 89 версий
Самые популярные
R
1.0.2Structure Layout Optimizer 1.0.2
1.20.1
R
1.0.10+1.20.1-forgeStructure Layout Optimizer v1.0.10 (forge 1.20.1)
1.20.1
R
1.0.11+1.20.1-forgeStructure Layout Optimizer v1.0.11 (forge 1.20.1)
1.20.1
R
1.0.12+1.21.1-neoforgeStructure Layout Optimizer v1.0.12 (neoforge 1.21.1)
1.21.1
R
1.0.11+1.20.1-fabricStructure Layout Optimizer v1.0.11 (fabric 1.20.1)
1.20.1
R
1.0.10+1.20.1-fabricStructure Layout Optimizer v1.0.10 (fabric 1.20.1)
1.20.1
Самые Новые
R
1.1.4+26.3-fabricStructure Layout Optimizer v1.1.4 (26.3 Fabric)
26.3
R
1.1.4+26.3-neoforgeStructure Layout Optimizer v1.1.4 (26.3 Neoforge)
26.3
R
1.1.5+1.21.9-neoforgeStructure Layout Optimizer v1.1.5 (1.21.9 Neoforge)
1.21.9–1.21.10
R
1.1.4+26.1-neoforgeStructure Layout Optimizer v1.1.4 (26.1 Neoforge)
26.1.x26.2
R
1.1.4+26.1-fabricStructure Layout Optimizer v1.1.4 (26.1 Fabric)
26.1.x26.2
R
1.1.4+1.21.11-neoforgeStructure Layout Optimizer v1.1.4 (1.21.11 Neoforge)
1.21.11
R
1.1.4+1.21.11-fabricStructure Layout Optimizer v1.1.4 (1.21.11 Fabric)
1.21.11
R
1.1.4+1.21.9-neoforgeStructure Layout Optimizer v1.1.4 (1.21.9 Neoforge)
1.21.9–1.21.10
R
1.1.4+1.21.9-fabricStructure Layout Optimizer v1.1.4 (1.21.9 Fabric)
1.21.9–1.21.10
R
1.1.4+1.21.6-neoforgeStructure Layout Optimizer v1.1.4 (1.21.6 Neoforge)
1.21.6–1.21.8
Главная