Release notes
LeanCore Changelog
ActiveHytale • Latest version 1.7.0
Changelog version 1.7.0
Добавлено
- Спячка зон с учётом содержимого: LeanCore теперь измеряет плотность построенного содержимого по зонам (сундуки, верстаки и другие block entities) и смещает таймеры спячки и порядок выгрузки в сторону того, чтобы дольше держать загруженными зоны, богатые содержимым, даже если они простаивают. Включено по умолчанию
- Управление горячим/симуляционным радиусом: под давлением кучи LeanCore может урезать серверный радиус тиков, отдельный от клиентского радиуса обзора, чтобы не было подгрузки в кадре, снижая стоимость симуляции поверх уже имеющихся урезаний обзора. Включено по умолчанию, с тем же окном grace, что и у регулятора обзора
- Точный учёт выгрузки по чанкам: выгрузка чанков движком теперь считается точно в потоке мира, а не выводится из чистой разницы загруженных чанков, благодаря чему сигнал обучения «эта выгрузка удержалась» становится гораздо чище. Включено по умолчанию
Изменено
- Чтения по миру (горячие зоны, diff набора чанков, скан содержимого) объединены в один dispatch потока мира за тик, что снижает накладные расходы на dispatch
- Изменения горячего радиуса теперь логируются, так что регулятор радиуса тиков сообщает свою цель так же, как это уже делает регулятор обзора
- Схема персистентности обучения поднята до v9 (добавляет content score по зоне); старые снимки v7 и v8 читаются и обновляются автоматически
Исправлено
- Статистика повторного использования зон теперь неизменяема для безопасного чтения между потоками, счётчики false-cut атомарны, а трекер набора чанков по миру больше не удерживает снимки исчезнувших миров
- Старение спячки больше не продвигает свои часы, когда fan-out по мирам завершается лишь частично под нагрузкой, так что простаивающие зоны по-прежнему остывают вовремя
- Завершение работы рантайма защищено от двойного выполнения, так что перезапуск не запускает путь сохранения и разборки дважды
- Задачи потока мира, бросающие исключение, теперь логируются, а не проглатываются молча
- Богатые содержимым зоны теперь сохраняются даже до достижения обычного порога посещений
Примечания
- Новые ключи
LeanCore.jsonдобавляются при первом запуске: точный учёт выгрузки по чанкам, модель содержимого и управление горячим радиусом включены по умолчанию. Установите их в false, чтобы сохранить поведение 1.6.x - Существующие
LeanCore.jsonиlearning.state.gzсохраняются и обновляются на месте; без ручной миграции
Changelog version 1.6.1
Изменено
- Внутренняя чистка: удалён мёртвый код (неиспользуемый тип снимка, неиспользуемые помощники dormancy/profile, устаревшие писатели персистентности). Без изменения поведения
Исправлено
- Потокобезопасность: выборка разброса кучи, региональное давление сущностей, опрос выгрузки движка, насыщение чанков, позиции игроков dormancy и одиночное движение теперь повторно используют позицию, снятую в потоке мира, или выполняются внутри диспетчеризации мира, вместо чтения трансформаций игрока или хранилищ чанков вне потока мира
- Тайм-ауты диспетчеризации учитываются: задача мира, превысившая время, больше не продвигает состояние политики и не завышает число выгруженных чанков; действие просто повторяется на следующем тике
- Админ-инструменты работают при выключенном HUD:
/leancore heatmapи/leancore zone pin|unpin|pinsбольше не требуютhudFeatureEnabled, поэтому админы могут использовать их с отключённым HUD (по умолчанию)
Примечания
- Никаких изменений конфигурации, команд или API с версии 1.6.0; существующие
LeanCore.jsonиlearning.state.gzсохраняются как есть - Обновление без миграции с 1.6.0; по-прежнему требуется сервер Hytale >=0.5.6
Changelog version 1.6.0
Добавлено
- Модель движения игрока (
motionModelEnabled, включена по умолчанию): скорость и уверенность на игрока с прогнозом позиции на коротком горизонте - Предиктивное удержание зон: unload чанков смещается в сторону от направления игрока; зоны в текущем или прогнозируемом view никогда не становятся кандидатами на unload (защищённый конус)
- Модель reuse-distance + выживаемости (
zoneReuseModelEnabled, включена по умолчанию): учится, какие зоны посещаются повторно, и подстраивает пороги dormancy для каждой зоны; сохраняется с prune/TTL - Диагностика всегда включена (
diagnosticLogEnabled, включена по умолчанию): сводки старта/остановки и логи решений[diag]для каждого профиля, так что один лог сервера объясняет, что сделал мод и почему - Кинематографичный буст view (
motionViewRadiusBoostEnabled, opt-in / выключен по умолчанию): плавно поднимает дистанцию обзора для быстро движущихся - Schema снимка v8: добавляет features движения игрока и статистику reuse зон; читает снимки v7
Изменено
- Ранжирование unload в dormancy измеряет дистанцию до ближайшего чанка зоны (край AABB), а не до центра, для более точного unload
- Persistence learning выполняется в выделенном потоке единственного писателя, отдельно от tick runtime
- Новый
LeanCore.jsonс defaults 1.6.0: модель движения и модель reuse включены; кинематографичный буст выключен
Исправлено
- Безопасность multi-world: fan-out по миру делает merge только при успехе и соблюдает бюджет на tick; аффинность world thread исправлена, чтобы один мир никогда не старил и не выгружал зоны другого
- Persistence без race: flush единственного писателя с уникальными temp-файлами; thread-safe features движения и классификатор активности; симметричные лимиты чтения/записи в codec
- Плавность стриминга чанков: кинематографичный буст остаётся выключенным по умолчанию, потому что перезапись client view radius каждый tick вызывает churn чанков и stutter в текущем engine
Удалено
- Публичная поверхность
LeanCoreAPI(теперь только внутренняя)
Примечания
- Требует сервер Hytale >=0.5.6
- Defaults solo/LITE остаются плавными: модели движения и reuse сами по себе не меняют view radius или скорость чанков; кинематографичный буст это opt-in
- Остаточный stutter загрузки чанков при быстром движении это сторона engine (pre-load hooks) и вне досягаемости мода
Changelog version 1.5.0
Добавлено
- LITE губернатор памяти в embedded solo (
liteMemoryGovernorEnabled, включён по умолчанию): масштаб view, понижение зон и unload sweeps безgovernEnabled - Адаптивный view-radius в LITE (
liteViewRadiusEnabled): COMFORT 100% до давления чанков или heap; мягкие срезы в WATCH; агрессивно только в TIGHT/CRITICAL - AFK unload в LITE (
liteUnloadEnabled): reclaim дальних dormant/frozen зон в idle; probe gate всё ещё нужен;unloadEnabledв соло не требуется - LITE learning (
liteLearningEnabled, по умолчанию вкл.): demand model + gzip persistence в соло; без bandit и holdout в LITE - Ключи lite:
liteViewPressureThreshold,liteViewComfortCapScale,liteViewWatchScale,liteViewTightScale,liteViewCriticalScale,liteMinClientViewRadius,liteViewRadiusLoginGraceSeconds,liteUnloadIdleSeconds,liteUnloadMaxChunksPerSweep - Двойные сигналы давления в LITE: tier heap JVM + насыщение чанков (
loaded / view budget) /leancore savings: блок lite губернатора (preset, tier, lite flags, счётчики зон/чанков)/leancore status: lite flags govern/view/learning/unload и строка lite unload gate/leancore learn: подпись LITE поясняет demand-only learning в соло
Изменено
- Профиль solo LITE теперь выполняет полный tick lite губернатора на world thread (не только sampling dormancy)
- Новый
LeanCore.jsonс defaults 1.5.0 (lite*Enabled=true; STANDARD/FULL пути off, пока не включите) - Интервал persistence STANDARD/FULL консервативный; LITE flush по своему пути при включённом
liteLearningEnabled
Исправлено
- World-thread dispatch с областью по миру (
GovernorWorldContext); inline dispatch только для нужного мира - Tick LITE губернатора полностью внутри
world.execute - Усиление загрузки learning: невалидный
learning.state.gzв карантин; валидация codec при чтении - Санитизация
LeanCore.json: невалидный JSON в карантин, атомарная запись, лимиты на ключи view/unload
Примечания
- LITE unload всё ещё требует
/leancore probeприunloadProbeGateEnabled(по умолчанию) - LITE sweeps только при tier heap WATCH или хуже и distant dormant зонах; COMFORT + низкий spread с unload 0 это норма
- STANDARD/FULL без изменений:
governEnabled,learningEnabled,unloadEnabledкак раньше embeddedStandardProfile: trueтолько для dev dogfood STANDARD в соло
Changelog version 1.4.1
Добавлено
- Шлюз probe для unload (
unloadProbeGateEnabled, по умолчанию вкл.): policy unload чанков блокируется, пока/leancore probeне пройдёт; строка шлюза в/leancore status;probePassedAtMsсохраняется вLeanCore.json - Метрики сессии gcHint в
/leancore savingsприgcHintEnabled(число hints и возраст последнего hint)
Изменено
/leancore statusпоказывает solo LITE диагностику (adaptive tick, флаги govern/learning/unload, строка unload gate)/leancore probeсохраняет время успеха и подтверждает открытие unload gate/leancore learnпоказывает статус flush learning (flushErr, время последнего flush); ошибки IO v7 при load/flush пишутся в серверный лог
Исправлено
- Governor откладывает unload, view-radius и regional pressure, если primary world отсутствует (heap sampling и learning продолжаются)
Примечания
- Unload на STANDARD/FULL по-прежнему требует
governEnabled+unloadEnabled+ успешный probe при включённом шлюзе unloadProbeGateEnabled: falseтолько если намеренно отключаете защитный шлюз- View-radius на embedded solo без изменений: нужен
dedicatedServerMode: true
Changelog version 1.4.0
Добавлено
-
Снимок learning v7 (
learning.state.gz): gzip binary; миграция legacylearning.stateпри первом flush -
Ограничение профилей:
learningMaxPersistedPlayers(по умолчанию 512) иlearningPlayerTtlDays(по умолчанию 90) -
embeddedStandardProfile: встроенный solo на STANDARD (15s) безdedicatedServerMode/ FULL tick 5s -
Слой dispatch на world thread:
WorldDispatch,GovernorWorldContext,RuntimeGuardдля семантикиTickingThreadHytale -
gcHintEnabled: экспериментальный GC hint в LITE idle (выключен по умолчанию)
Изменено
-
Daemon scheduler
LeanCore-runtime; ранний shutdown наShutdownEvent -
Тики губернатора: coalesced
world.execute(не более одного pending tick; scheduler больше не блокируется до 5s) -
Policy apply + unload чанков inline при
world.isInThread() -
HUD снимается при shutdown; webhook HttpClient на daemon executor
Исправлено
-
Zombie
java.exeпосле закрытия embedded Hytale с dedicated-style config (вложенныйworld.execute+ блокирующее ожидание оставляли задачи в очереди world;TickingThreadдержал JVM живой послеShutdown completed!) -
View-radius на embedded solo по-прежнему требует
dedicatedServerMode: true(намеренное правило)
Примечания
- Включайте
unloadEnabledтолько после baseline в/leancore probe
Changelog version 1.3.0
Добавлено
-
/leancore savings: пик/baseline/delta heap JVM сессии, состояние губернатора и кумулятивные действия зон/чанков (измерено vs оценка) -
DedicatedBootstrap: одноразовый preset при первом boot выделенного хоста (governEnabled,viewRadiusGovernanceEnabled,learningEnabled;unloadEnabledостаётся off) -
10-минутная grace для view-radius после старта выделенного runtime
Изменено
-
ZoneDormancyMap: инкрементальный refresh без полного rebuild карты; prune устаревших зон -
OnlineLinearDemandModel: weight decay (0.9995) на update для смены стиля игры -
chunkUnloadEventTracking: подсчёт unload engine через polling на world thread (без ECS-слушателяChunkUnloadEvent) -
Tick губернатора STANDARD/FULL выполняется на world thread
Исправлено
-
Краш на preset FULL / выделенном (
Assert not in threadпри unload чанков engine) из-за доступа кChunkStoreне с world thread и небезопасной регистрации unload-события -
Региональный зонд давления (
S4) больше не читаетChunkStoreс thread планировщика
Заметки
-
/leancore savingsпоказывает только JVM heap — не RAM VPS/OS -
dedicatedBootstrapEnabled: falseотключает автоматический preset -
JAR на CurseForge должен включать коммиты thread-safety в
mainпосле53c801f
Changelog version 1.2.1
Добавлено
- Кэш классификации break/place и кэш gather type по предмету
- Окно недавней активности для быстрого переключения MINER / LUMBERJACK / BUILDER
- Dirty flush
learning.stateпри включённом learning
Изменено
- Период полураспада EMA активности 20s с перекрёстным подавлением при смене role
- Обучение ML с throttle; профиль LITE без chunk probe на тике dormancy
- Hatchet и деревянные блоки Hytale раньше эвристик кирки
Исправлено
- Медленная смена role при переходе с добычи на рубку дерева
- Decay EMA на solo LITE во время событий блоков
- Stutter от classify + train ML на каждом ломании в ECS thread
Заметки
- Тот же schema v4
learning.state, что и в 1.2.0 - Главный KPI по-прежнему JVM heap сервера
Changelog version 1.2.0
Добавлено
- Activity Sense (ML): онлайн мультиклассовый softmax-классификатор, обучаемый на живых ECS-событиях
- Классификатор блока/инструмента: id предмета, gather type и группа блока помечают ломание/установку (MINE, CHOP, FARM, BUILD)
- Новые стили игры:
MINER,LUMBERJACK,FARMERвместе с существующими поведениями - EMA по активности: mine, wood, farm, build, craft, combat в скользящих окнах
- Слушатель боя: FIGHTER только от событий урона, не от обычного ломания блоков
- Сигнал крафта:
CraftRecipeEvent.Preпитает активность крафта - Схема признаков v2 (
demandDim=11) с EMA по конкретным активностям /leancore learn player: EMA активности и статусactivityModel=SOFTMAX- Юнит-тесты для классификатора блоков, модели активности и posterior
Изменено
- Поведенческий posterior использует ML softmax как основной путь; EMA fallback до прогрева
learning.stateschema v4: сохраняет классификатор активности + EMA по игрокам/leancore learnсообщаетfeatureSchema=v2, когда demand model активен
Исправлено
- Добыча киркой больше не помечается как FIGHTER — ломание взвешивается по контексту инструмента/блока
Заметки
- ML активности работает in-process на JVM сервера (без клиентского мода)
- Эвристика выступает teacher, пока softmax не прогреется (
updates >= 8) - Главный KPI по-прежнему JVM heap сервера, не FPS клиента
Changelog version 1.1.0
Добавлено
-
Масштабируемые профили runtime на встроенном хосте:
LITE(solo),STANDARD(друзья),FULL(выделенный) -
localHostModeAUTO (по умолчанию): лёгкий dormancy в solo; усиление при входе друзей -
Региональный зонд сущностей (S4): подсчёт по зонам через
EntityChunkв/leancore probe -
Отслеживание
ChunkUnloadEvent(опционально): счётчики policy vs engine в/leancore learn -
OnlineLinearDemandModel: обучаемый спрос на retention с activity features (schema v1) -
LeanCoreAPI: tier, pin/unpin зон, снимки игрока для других модов -
Holdout cohort (10%): bandit учится на treatment; holdout без view-radius cuts
-
Юнит-тесты профилей runtime, политики активации, нормализации и demand model
Изменено
-
Runtime использует
HytaleServer.SCHEDULED_EXECUTORс начальной задержкой 30s на локальных мирах -
Безопасные defaults:
governEnabled=false,viewRadiusGovernanceEnabled=false, HUD/learning выкл. -
View-radius governance отключена в embedded solo даже при включённом governor
-
Policy applier меняет view-radius только при реальной смене policy (throttle)
-
/leancore statusпоказывает активный profile (LITE/STANDARD/FULL) -
/leancore learnпоказываетfeatureSchema=v1, demand model и unload attribution
Исправлено
-
Локальные миры больше не лагают от тяжёлого tick каждые 5s + HUD + learning
-
Отслеживание chunk unload выкл. по умолчанию (избегает assert потока engine)
Примечания
-
Главный KPI — heap JVM сервера, не FPS или GPU клиента
-
Solo:
localHostMode: AUTO. Выделенный:dedicatedServerMode: true, затем настройка governor
Changelog version 1.0.0
Добавлено
- Первый стабильный публичный релиз (
1.0.0) - Губернатор памяти с уровнями COMFORT → CRITICAL, rollback и контекстным обучением
- Карта пространственной дремоты (HOT / WARM / DORMANT / FROZEN) и unload чанков
- Спрос удержания по игрокам из живой активности
- Квантили heap сервера и персистентность
learning.state(schema v3) - Admin HUD (
/leancore hud on|off|status) — opt-in, группы и права - Heatmap зон (
/leancore heatmap [limit]) - Zone pin (
/leancore zone pin|unpin|pins) - Опциональный CRITICAL webhook (
criticalWebhookUrl, generic JSON) - Серверный asset pack для HUD UI
Заметки
- Основной KPI — JVM heap сервера, не FPS клиента