
Sepals
Sepals - экспериментальный мод для серверов Minecraft, который радикально оптимизирует ИИ мобов, обработку сущностей и тайки. Особенно полезен на фермах с большим скоплением жителей и лягушек.
Sepals
Sepals - это экспериментальный, но чертовски мощный оптимизационный мод для серверов Майнкрафт. В отличие от большинства "общих" оптимизаций вроде Lithium, Sepals бьёт точечно в самые узкие места ванильного движка: ИИ мобов, обработку сущностей и систему задач. Если у вас на сервере огромные фермы, залы с жителями или куча мобов на маленькой площади - этот мод может дать просто бешеный прирост производительности.
Разработчики рекомендуют использовать Sepals вместе с Lithium и Async для максимального эффекта. Но учти: мод экспериментальный, и не все фичи гарантированно повторяют ванильное поведение. На обычном SMP с парой курочек разницы ты не заметишь, а вот на хардкорных фермах - вполне.
Что делает Sepals на практике?
Если у тебя на сервере есть:
- большие фермы жителей или автоматические фермы мобов
- залы с десятками и сотнями деревенских
- скученные вольеры с лягушками или другими мобами
...то Sepals резко снижает время тика, обходя самые дорогие операции ванильного ИИ. В стресс-тестах прирост просто колоссальный - вплоть до 99% в некоторых сценариях.
Совместимость
На данный момент Sepals совместим почти со всеми популярными модами. Вот проверенный список:
| Мод | Требуемая версия |
|---|---|
| Sodium | все |
| Iris | все |
| FerriteCore | все |
| Krypton | все |
| Lithium | >=0.18.0 |
| C2ME | >=0.3.4.0.0 |
| Moonrise | >=0.6.0-beta.1+45edfd7 |
| Async | >=0.1.7+alpha.7-1.21.8 |
Если не знаешь, какую версию выбрать - бери самую свежую, Sepals под неё подстроится.
Важно
Мод не поддерживает старые версии Minecraft и снапшоты - все фиксы и фичи только для актуальных релизов. При использовании с Async советуют вручную сравнить производительность и покрутить конфиги, потому что на разных машинах результаты могут отличаться. За это отвечает опция enableSepalsEntitiesCramming.
Конфиг
| Название | Допустимые значения | По умолчанию |
|---|---|---|
| forceEnableSepalsPoi | bool | false |
| enableSepalsVillager | bool | true |
| enableSepalsFrogLookAt | bool | true |
| enableSepalsFrogAttackableSensor | bool | true |
| enableSepalsLivingTargetCache | bool | true |
| nearestLivingEntitiesSensorUseQuickSort | bool | true |
| enableSepalsBiasedLongJumpTask | bool | true |
| enableSepalsEntitiesCramming | bool | true |
| enableSepalsItemMerge | bool | true |
| enableSepalsQuickCanBePushByEntityPredicate | bool | true |
Производительность: тесты и цифры
Тесты проводились на сервере Mars от feimia (CPU: Intel i7-14700K, 4ГБ ОЗУ, Ubuntu 24.04.1 LTS, Minecraft 1.21). Вот что получилось.
Entities cramming (давка сущностей)
Использует кэш блоков, чтобы избежать лишних вызовов getOtherEntities. Игнорирует предикаты scoreboard/team для каждой сущности - в ванилле это не влияет ни на что, кроме командных блоков. Включено по умолчанию.
1390 жителей в пространстве 7x7:
| Окружение | tickCramming | Процент (средн.) |
|---|---|---|
| Vanilla | 53.6 ms | 100% |
| Lithium | 54.4 ms | 101% |
| Sepals | 10.2 ms | 19% |
| Sepals + Lithium | 8.5 ms | 15% |
Weighted random (взвешенный случайный выбор)
Использует бинарный поиск вместо ванильного взвешенного рандома. По данным Spark, при построении таблиц диапазонов может быть медленнее ваниллы, даже если сам поиск близок к 0 мс. Отключено по умолчанию и не тестировалось.
Biased long jump task (задача длинного прыжка с уклоном)
Собственная реализация задачи прыжка для лягушек. Бинарный поиск почти бесплатен, таблица строится одновременно с генерацией целей, а Java Stream заменён на Catheter. Требует перезапуска сервера для применения изменений. Включено по умолчанию.
800 лягушек в пространстве 7x7:
| Окружение | keepRunning | Процент (средн.) |
|---|---|---|
| Vanilla (LongJumpTask) | 43.1 ms | 100% |
| Lithium (LongJumpTask) | 7.5 ms | 17% |
| Sepals (SepalsLongJumpTask) | 0.2 ms | 0.4% |
| Sepals + Lithium (SepalsLongJumpTask) | 0.05 ms | 0.1% |
| Окружение | getTarget | Процент (средн.) | Процент (в keepRunning) |
|---|---|---|---|
| Vanilla (LongJumpTask) | 43.1 ms | 100% | 100% |
| Lithium (LongJumpTask) | 3.6 ms | 9% | 48% |
| Sepals (SepalsLongJumpTask) | N/A ms | 0% | 0% |
| Sepals + Lithium (SepalsLongJumpTask) | N/A ms | 0% | 0% |
Quick sort в NearestLivingEntitiesSensor
Использует быструю сортировку из FastUtil вместо Java TIM-сортировки. Включено по умолчанию.
800 лягушек в пространстве 7x7:
| Окружение | sort (NearestLivingEntitiesSensor#sense) | Процент (средн.) |
|---|---|---|
| Vanilla | 3.8 ms | 100% |
| Lithium | 3.6 ms | 94% |
| Sepals | 2.2 ms | 57% |
| Sepals + Lithium | 2.2 ms | 57% |
Frog attackable target filter (фильтр атакуемых целей для лягушек)
Переставляет условия атакуемости так, чтобы самые дешёвые проверки шли первыми. В ванилле Sensor#testAttackableTargetPredicate вызывает TargetPredicate#test, который делает кучу raycast-вычислений - при большом количестве сущностей это адски медленно (9.8 мс на тик для 800 лягушек, из которых 7.3 мс - raycast). Sepals меняет порядок: сначала проверяется isValidFrogFood (просто тег), потом hasMemoryModule, isInRange, и только потом дорогой raycast. Включено по умолчанию.
800 лягушек в пространстве 7x7:
| Окружение | время | Процент (средн.) |
|---|---|---|
| Vanilla (FrogAttackablesSensor#matches) | 10 ms | 100% |
| Lithium (FrogAttackablesSensor#matches) | 5.7 ms | 57% |
| Sepals (SepalsFrogBrain#attackable) | 0.1 ms | 1% |
| Sepals + Lithium (SepalsFrogBrain#attackable) | 0.1 ms | 1% |
Frog look-at target filter (фильтр взгляда лягушки)
Использует SepalsLivingTargetCache для ускорения поиска целей. Raycast в TargetPredicate выполняется только если последующие условия успешны - если они проваливаются, raycast не нужен. Включено по умолчанию.
800 лягушек в пространстве 7x7:
| Окружение | findFirst | Процент |
|---|---|---|
| Vanilla (LookAtMobWithIntervalTask$$Lambda#findFirst) | 2.7 ms | 100% |
| Lithium (LookAtMobWithIntervalTask$$Lambda#findFirst) | 2.5 ms | 92% |
| Sepals (SepalsLookAtMobWithIntervalTask$$Lambda#findFirstPlayer) | 0.1 ms | 3% |
| Sepals + Lithium (SepalsLookAtMobWithIntervalTask$$Lambda#findFirstPlayer) | 0.1 ms | 3% |
Villager miscellaneous optimizations (разные оптимизации для жителей)
Тут целый набор фишек:
- Catheter вместо Java Stream для производительности
- Кэширование задач, активностей, выполняемых задач и памяти для ускорения старта и обновления
- Собственная композитная задача вместо ванильной
- Пропуск лишних raycast'ов и бесполезных предикатов
SepalsLivingTargetCacheвместо ванильного кэша- Перестановка предикатов: дорогие вычисления выполняются позже или не выполняются вовсе
- Оптимизация
SerializingRegionBasedStorageиз Lithium - Меньше дженериков и лишних операций
- Бинарный поиск по списку вместо поиска по HashSet
Рекомендуется использовать с Lithium и C2ME. Не проверено на долгосрочную стабильность (месяц работы показал норм), но статистических отличий от ваниллы не замечено. Включено по умолчанию.
800 жителей в пространстве 7x7 днём:
| Окружение | Brain#tick (Total) | Процент | Brain#startTasks | Процент(startTasks) | Brain#tickSensors | Процент(tickSensors) | Brain#updateTasks | Процент(updateTasks) | Brain#tickMemories | Процент(tickMemories) |
|---|---|---|---|---|---|---|---|---|---|---|
| Vanilla | 18 ms | 100% | 9.3 ms | 100% | 5.2 ms | 100% | 3 ms | 100% | 0.5 ms | 100% |
| Lithium | 12.4 ms | 68% | 4.8 ms | 51% | 5.9 ms | 113% | 1.2 ms | 40% | 0.5 ms | 100% |
| Sepals | 9.7 ms | 53% | 3.6 ms | 38% | 3.7 ms | 71% | 2 ms | 66% | 0.4 ms | 80% |
| Sepals + Lithium | 10 ms | 55% | 3.4 ms | 36% | 3.7 ms | 71% | 2.5 ms | 83% | 0.4 ms | 80% |
800 жителей в пространстве 7x7 ночью:
| Окружение | Brain#tick (Total) | Процент | Brain#startTasks | Процент(startTasks) | Brain#tickSensors | Процент(tickSensors) | Brain#updateTasks | Процент(updateTasks) | Brain#tickMemories | Процент(tickMemories) |
|---|---|---|---|---|---|---|---|---|---|---|
| Vanilla | 16.7 ms | 100% | 8.2 ms | 100% | 6 ms | 100% | 2 ms | 100% | 0.5 ms | 100% |
| Lithium | 10.2 ms | 61% | 3.2 ms | 24% | 6 ms | 113% | 0.5 ms | 25% | 0.5 ms | 100% |
| Sepals | 9 ms | 53% | 3.3 ms | 16% | 4.7 ms | 78% | 0.7 ms | 35% | 0.3 ms | 60% |
| Sepals + Lithium | 8.7 ms | 52% | 2.9 ms | 11% | 4.6 ms | 76% | 0.7 ms | 35% | 0.5 ms | 100% |
Predicate optimization (оптимизация предикатов)
1172 лягушки в пространстве 3x3:
| Окружение | время | Процент (средн.) |
|---|---|---|
| Vanilla (java.util.function.Predicate.lambda$and$0()) | 49.01 ms | 100% |
| Sepals (com.github.cao.awa.sepals.entity.predicate.SepalsEntityPredicates$$Lambda/...) | 22.6 ms | 46% |
Итог
Sepals - это не панацея, а скорее мощный инструмент для узких сценариев. Если у тебя сервер с десятками тысяч мобов на фермах - этот мод может дать прирост в разы. Но на обычном выживании с парой деревенек разница будет незаметна. Экспериментальность означает, что могут быть баги или неполное соответствие ванилле, так что перед установкой на продакшн-сервер лучше протестировать на тестовом мире.
Скачать Sepals и попробовать в деле стоит каждому, кто хочет выжать максимум из своего сервера Майнкрафт - особенно если ты используешь Fabric и современные версии игры.
