Release notes
LeanCore Changelog
ActiveHytale • Latest version 1.7.0
Changelog version 1.7.0
Añadido
- Dormancia de zona consciente del contenido: LeanCore ahora muestrea la densidad de contenido construido por zona (cofres, mesas de trabajo y otras block entities) y sesga los temporizadores de dormancia y el orden de expulsión para mantener cargadas más tiempo las zonas ricas en contenido, incluso inactivas. Activado por defecto
- Gobernanza del radio caliente/de simulación: bajo presión de heap, LeanCore puede recortar el radio de ticking del servidor, separado del radio de vista del cliente para que no haya pop-in, reduciendo el coste de simulación además de los recortes de vista ya existentes. Activado por defecto, con la misma ventana de gracia que el gobernador de vista
- Verdad de descarga por chunk: la expulsión de chunks del engine ahora se cuenta de forma exacta en el hilo del mundo, en vez de inferirse del delta neto de chunks cargados, dejando la señal de aprendizaje de “esta descarga se mantuvo” mucho más limpia. Activado por defecto
Cambiado
- Las lecturas por mundo (zonas calientes, diff del conjunto de chunks, escaneo de contenido) se agrupan en un único dispatch del hilo del mundo por tick, reduciendo el overhead de dispatch
- Los cambios del radio caliente ahora se registran, así que el gobernador del radio de ticking reporta su objetivo igual que ya lo hace el gobernador de vista
- El esquema de persistencia de aprendizaje sube a v9 (añade un content score por zona); los snapshots antiguos v7 y v8 se leen y actualizan automáticamente
Corregido
- Los stats de reúso de zona ahora son inmutables para lecturas seguras entre hilos, los contadores de false-cut son atómicos, y el tracker del conjunto de chunks por mundo ya no retiene snapshots de mundos que desaparecieron
- El envejecimiento de la dormancia ya no avanza su reloj cuando un fan-out por mundo solo se completa parcialmente bajo carga, así que las zonas inactivas siguen enfriándose a tiempo
- El apagado del runtime está protegido contra ejecución doble, así que un reinicio no ejecuta el camino de guardado y cierre dos veces
- Las tareas del hilo del mundo que lanzan excepción ahora se registran, en vez de tragarse en silencio
- Las zonas ricas en contenido ahora persisten incluso antes de alcanzar el umbral normal de visitas
Notas
- Se añaden nuevas claves de
LeanCore.jsonen el primer arranque: la verdad de descarga por chunk, el modelo de contenido y la gobernanza del radio caliente vienen activadas por defecto. Ponlas en false para mantener el comportamiento de 1.6.x - El
LeanCore.jsony ellearning.state.gzexistentes se conservan y actualizan en su lugar; sin migración manual
Changelog version 1.6.1
Cambiado
- Limpieza interna: eliminación de código muerto (tipo de snapshot sin uso, helpers de dormancy/profile sin uso, writers de persistencia heredados). Sin cambios de comportamiento
Corregido
- Seguridad de hilos: el muestreo de dispersión de heap, la presión regional de entidades, el sondeo de descarga del motor, la saturación de chunks, las posiciones de jugador de dormancy y el movimiento en solitario ahora reutilizan la posición muestreada en el hilo del mundo o se ejecutan dentro de un dispatch de mundo, en vez de leer transforms de jugador o chunk stores fuera del hilo del mundo
- Se respetan los timeouts de dispatch: una tarea de mundo que agotó el tiempo ya no avanza el estado de política ni sobreestima los chunks descargados; la acción simplemente se reintenta en el siguiente tick
- Las herramientas de admin funcionan con el HUD apagado:
/leancore heatmapy/leancore zone pin|unpin|pinsya no dependen dehudFeatureEnabled, así que los admins pueden usarlas con el HUD desactivado (el valor por defecto)
Notas
- Sin cambios de config, comandos o API desde 1.6.0; se conservan el
LeanCore.jsony ellearning.state.gzexistentes - Actualización directa desde 1.6.0; sigue requiriendo servidor Hytale >=0.5.6
Changelog version 1.6.0
Añadido
- Modelo de movimiento del jugador (
motionModelEnabled, activado por defecto): velocidad y confianza por jugador con posición prevista en un horizonte corto - Retención predictiva de zonas: el unload de chunks se inclina lejos de hacia dónde va el jugador; las zonas en la vista actual o prevista nunca son candidatas a unload (cono protegido)
- Modelo de reuse-distance + supervivencia (
zoneReuseModelEnabled, activado por defecto): aprende qué zonas se revisitan y ajusta los umbrales de dormancia por zona; persistido con prune/TTL - Diagnóstico siempre activo (
diagnosticLogEnabled, activado por defecto): resúmenes de inicio/cierre y logs de decisión[diag]para cada perfil, de modo que solo el log del servidor explica qué hizo el mod y por qué - Boost cinematográfico de vista (
motionViewRadiusBoostEnabled, opt-in / desactivado por defecto): sube la distancia de visión de forma suave para quien se mueve rápido - Schema de snapshot v8: añade features de movimiento del jugador y stats de reuse de zona; lee snapshots v7
Cambiado
- El ranking de unload de dormancia mide la distancia al chunk más cercano de la zona (borde AABB), no al centro, para un unload más preciso
- La persistencia de learning corre en un hilo dedicado de escritor único, separado del tick del runtime
LeanCore.jsonnuevo trae defaults 1.6.0: modelo de movimiento y modelo de reuse activados; boost cinematográfico desactivado
Corregido
- Seguridad multi-mundo: el fan-out por mundo solo hace merge en caso de éxito y respeta un presupuesto por tick; afinidad de world thread corregida para que un mundo nunca envejezca ni descargue zonas de otro
- Persistencia sin race: flush de escritor único con archivos temp únicos; features de movimiento y clasificador de actividad thread-safe; límites simétricos de lectura/escritura en el codec
- Suavidad del streaming de chunks: el boost cinematográfico queda desactivado por defecto porque reescribir el view radius del cliente cada tick genera churn de chunks y stutter en el engine actual
Eliminado
- Superficie pública
LeanCoreAPI(ahora solo interna)
Notas
- Requiere servidor Hytale >=0.5.6
- Los defaults solo/LITE siguen suaves: los modelos de movimiento y reuse no cambian view radius ni tasa de chunks por sí solos; el boost cinematográfico es opt-in
- El stutter residual de carga de chunks en movimiento rápido es del engine (hooks de pre-load) y fuera del alcance del mod
Changelog version 1.5.0
Añadido
- Gobernador de memoria LITE en solo integrado (
liteMemoryGovernorEnabled, activado por defecto): escala de vista, degradación de zonas y barridos de unload singovernEnabled - View-radius adaptativa en LITE (
liteViewRadiusEnabled): COMFORT al 100% hasta presión de chunks o heap; cortes suaves en WATCH; agresivo solo en TIGHT/CRITICAL - Unload AFK en LITE (
liteUnloadEnabled): reclaim de zonas dormant/frozen lejanas en idle; la puerta de probe sigue aplicando; no requiereunloadEnableden solo - Aprendizaje LITE (
liteLearningEnabled, activado por defecto): demand model + persistencia gzip en solo; sin bandit ni holdout en LITE - Claves lite:
liteViewPressureThreshold,liteViewComfortCapScale,liteViewWatchScale,liteViewTightScale,liteViewCriticalScale,liteMinClientViewRadius,liteViewRadiusLoginGraceSeconds,liteUnloadIdleSeconds,liteUnloadMaxChunksPerSweep - Señales dobles de presión en LITE: tier de heap JVM + saturación de chunks (
loaded / view budget) /leancore savings: bloque del gobernador lite (preset, tier, flags lite, contadores de zona/chunk)/leancore status: flags lite govern/view/learning/unload y línea de puerta lite unload/leancore learn: pie LITE aclara aprendizaje solo de demanda en solo
Cambiado
- El perfil solo LITE ahora ejecuta tick completo del gobernador lite en la world thread (no solo muestreo de dormancia)
LeanCore.jsonnuevo trae defaults 1.5.0 (lite*Enabled=true; rutas STANDARD/FULL siguen off hasta activarlas)- Intervalo de persistencia STANDARD/FULL conservador; LITE hace flush en su propia ruta con
liteLearningEnabledactivo
Corregido
- Dispatch en world thread con alcance por mundo (
GovernorWorldContext); dispatch inline solo en el mundo correcto - Tick del gobernador LITE corre enteramente dentro de
world.execute - Endurecimiento de carga de learning:
learning.state.gzinválido en cuarentena; validación del codec al leer - Sanitización de
LeanCore.json: JSON inválido en cuarentena, guardado atómico, límites en claves de view/unload
Notas
- Unload LITE aún necesita
/leancore probeconunloadProbeGateEnabledactivo (por defecto) - Barridos LITE solo corren con tier de heap WATCH o peor y zonas distant dormant; COMFORT + spread bajo con unload cero es normal
- STANDARD/FULL sin cambios:
governEnabled,learningEnabled,unloadEnabledcomo antes - Usa
embeddedStandardProfile: truesolo para dogfood de STANDARD en solo
Changelog version 1.4.1
Añadido
- Puerta de probe para unload (
unloadProbeGateEnabled, activada por defecto): el unload de chunks por política queda bloqueado hasta que/leancore probepase; línea de la puerta en/leancore status;probePassedAtMsguardado enLeanCore.json - Métricas de sesión de gcHint en
/leancore savingscuandogcHintEnabledestá activo (recuento de hints y antigüedad del último hint)
Cambiado
/leancore statusmuestra diagnósticos solo LITE (tick adaptativo, flags govern/learning/unload, línea de la puerta de unload)/leancore probepersiste la marca de tiempo al pasar y confirma cuando se abre la puerta de unload/leancore learninforma del estado del flush de learning (flushErr, hora del último flush); errores de IO v7 en load/flush van al log del servidor
Corregido
- El governor aplaza unload, view-radius y presión regional cuando falta la world primaria (muestreo de heap y actualizaciones de learning continúan)
Notas
- El unload en STANDARD/FULL sigue requiriendo
governEnabled+unloadEnabled+ probe exitoso con la puerta activada - Pon
unloadProbeGateEnabled: falsesolo si quieres anular la puerta de seguridad a propósito - View-radius en solo embebido sin cambios: requiere
dedicatedServerMode: true
Changelog version 1.4.0
Añadido
-
Snapshot de learning v7 (
learning.state.gz): formato binario gzip; migra ellearning.statelegado en el primer flush -
Poda de perfiles:
learningMaxPersistedPlayers(predeterminado 512) ylearningPlayerTtlDays(predeterminado 90) -
embeddedStandardProfile: solo embebido en STANDARD (15s) sindedicatedServerMode/ tick FULL de 5s -
Capa de dispatch en world thread:
WorldDispatch,GovernorWorldContext,RuntimeGuardpara la semánticaTickingThreadde Hytale -
gcHintEnabled: hint experimental de GC en idle LITE (desactivado por defecto)
Cambiado
-
Scheduler daemon
LeanCore-runtime; shutdown anticipado enShutdownEvent -
Ticks del governor:
world.executecoalescido (como máximo un tick pendiente; el scheduler ya no bloquea hasta 5s) -
Policy apply + unload de chunks inline cuando
world.isInThread() -
HUD eliminado en shutdown; HttpClient de webhook en executor daemon
Corregido
-
java.exezombie al cerrar Hytale embebido con config estilo dedicado (world.executeanidado + espera bloqueante dejaba tareas en la cola de la world;TickingThreadmantenía la JVM viva trasShutdown completed!) -
View-radius en solo embebido sigue requiriendo
dedicatedServerMode: true(regla intencional)
Notas
- Active
unloadEnabledsolo tras el baseline en/leancore probe
Changelog version 1.3.0
Añadido
-
/leancore savings: pico/baseline/delta de heap JVM de sesión, estado del gobernador y acciones cumulativas de zona/chunk (medido vs estimado) -
DedicatedBootstrap: preset único en el primer boot dedicado (governEnabled,viewRadiusGovernanceEnabled,learningEnabled;unloadEnabledpermanece off) -
Grace de 10 minutos para view-radius tras el arranque del runtime dedicado
Cambiado
-
ZoneDormancyMap: refresh incremental sin rebuild completo del mapa; prune de zonas antiguas -
OnlineLinearDemandModel: weight decay (0.9995) por update para adaptar cambios de estilo de juego -
chunkUnloadEventTracking: conteo de unloads de la engine vía polling en world thread (sin listener ECS deChunkUnloadEvent) -
Tick del gobernador STANDARD/FULL despachado en world thread
Corregido
-
Crash en preset FULL / dedicado (
Assert not in threaden unload de chunks de la engine) por acceso aChunkStorefuera de world thread y registro inseguro de evento de unload -
Sonda de presión regional (
S4) ya no leeChunkStoreen la thread del scheduler
Notas
-
/leancore savingsmuestra solo heap JVM — no es RAM de VPS/OS -
dedicatedBootstrapEnabled: falsedesactiva el preset automático -
El JAR de CurseForge debe incluir los commits de thread-safety en
maintras53c801f
Changelog version 1.2.1
Añadido
- Cache de clasificación break/place y cache de gather type por ítem
- Ventana de actividad reciente para cambio rápido MINER / LUMBERJACK / BUILDER
- Dirty flush de
learning.statecuando learning está activo
Cambiado
- Media-vida de EMAs de actividad en 20s con inhibición cruzada al cambiar de role
- Entrenamiento ML con throttle; perfil LITE sin chunk probe en tick de dormancy
- Hatchet y bloques de madera de Hytale antes de heurísticas de pico
Corregido
- Cambio lento de role al pasar de minería a tala
- Decay de EMA en LITE solo durante eventos de bloque
- Stutter por classify + train ML en cada rotura en el thread ECS
Notas
- Mismo schema v4 de
learning.stateque 1.2.0 - El KPI principal sigue siendo heap JVM del servidor
Changelog version 1.2.0
Añadido
- Activity Sense (ML): clasificador softmax multiclase online entrenado con eventos ECS en vivo
- Clasificador de bloque/herramienta: id de ítem, gather type y grupo del bloque etiquetan roturas/colocaciones (MINE, CHOP, FARM, BUILD)
- Nuevos estilos de juego:
MINER,LUMBERJACK,FARMERjunto a los comportamientos existentes - EMAs por actividad: mine, wood, farm, build, craft, combat en ventanas móviles
- Listener de combate: FIGHTER solo desde eventos de daño, no roturas genéricas de bloque
- Señal de craft:
CraftRecipeEvent.Prealimenta actividad de craft - Schema de features v2 (
demandDim=11) con EMAs específicos por actividad /leancore learn player: EMAs de actividad y estadoactivityModel=SOFTMAX- Tests unitarios para clasificador de bloque, modelo de actividad y posterior
Cambiado
- Posterior de comportamiento usa softmax ML como ruta principal; fallback EMA antes del warm-up
learning.stateschema v4: persiste clasificador de actividad + EMAs por jugador/leancore learnreportafeatureSchema=v2cuando el demand model está activo
Corregido
- Minar con pico ya no se etiqueta como FIGHTER — roturas ponderadas por contexto de herramienta/bloque
Notas
- El ML de actividad corre in-process en la JVM del servidor (sin mod en cliente)
- La heurística actúa como teacher hasta que el softmax calienta (
updates >= 8) - El KPI principal sigue siendo heap JVM del servidor, no FPS del cliente
Changelog version 1.1.0
Añadido
-
Perfiles de runtime escalados en host embebido:
LITE(solo),STANDARD(amigos),FULL(dedicado) -
localHostModeAUTO (por defecto): dormancy ligera en solo; escala cuando entran amigos -
Sonda regional de entidades (S4): conteo por zona vía
EntityChunken/leancore probe -
Seguimiento
ChunkUnloadEvent(opcional): contadores policy vs engine en/leancore learn -
OnlineLinearDemandModel: demanda de retención aprendida con features de actividad (schema v1) -
LeanCoreAPI: consultar tier, pin/unpin de zonas, snapshots de jugador para otros mods -
Cohorte holdout (10%): el bandit aprende del cohort treatment; holdout no recibe cortes de view-radius
-
Tests unitarios de perfiles de runtime, política de activación, normalización y demand model
Cambiado
-
El runtime usa
HytaleServer.SCHEDULED_EXECUTORcon retraso inicial de 30s en mundos locales -
Defaults más seguros:
governEnabled=false,viewRadiusGovernanceEnabled=false, HUD/learning off -
Gobernanza de view-radius desactivada en solo embebido aunque el governor esté activo
-
Policy applier solo aplica view-radius cuando la policy cambia de verdad (throttle)
-
/leancore statusmuestra el profile activo (LITE/STANDARD/FULL) -
/leancore learnmuestrafeatureSchema=v1, estado del demand model y atribución de unload
Corregido
-
Los mundos locales ya no stutterean por un tick pesado cada 5s + HUD + learning
-
Seguimiento de unload de chunks off por defecto (evita assert de thread del engine)
Notas
-
El KPI principal sigue siendo heap JVM del servidor, no FPS o GPU del cliente
-
Solo: mantén
localHostMode: AUTO. Dedicado:dedicatedServerMode: truey luego ajusta el governor
Changelog version 1.0.0
Añadido
- Primer lanzamiento estable público (
1.0.0) - Gobernador de memoria con tiers COMFORT → CRITICAL, rollback y aprendizaje contextual
- Mapa de dormancia espacial (HOT / WARM / DORMANT / FROZEN) y barridos de unload de chunks
- Demanda de retención por jugador desde actividad en vivo
- Cuantiles de heap calibrados en servidor y persistencia
learning.state(schema v3) - HUD admin (
/leancore hud on|off|status) — opt-in, grupos y permisos - Heatmap de zonas (
/leancore heatmap [limit]) - Overrides de zone pin (
/leancore zone pin|unpin|pins) - Webhook CRITICAL opcional (
criticalWebhookUrl, JSON genérico) - Asset pack de servidor para UI del HUD
Notas
- KPI principal es heap JVM del servidor, no FPS en cliente