Skip to content

⚡ Rendimiento y motor de control de colas

Agrarian Reform está diseñado para servidores de alto rendimiento, gestionando mega-granjas agrícolas masivas sin caídas de TPS ni tirones.


📊 Infobox de rendimiento

PropertyValue
Global Throttling BudgetCROPS_PER_TICK = 5
Queue Implementationjava.util.concurrent.ConcurrentLinkedQueue
Sub-Chunk Palette FilterhasOnlyAir() & maybeHas(AgrarianCropRules::isCropBlock)
Búsqueda de aguaAnillos concéntricos de Chebyshev ($r=1 \to \text{maxRange}$, salida rápida ante agua cercana)
Optimización de calzadoDescarte inmediato si se va descalzo ($0.0001\mu\text{s}$, sin consultar NBT de encantamientos)
Registro de diagnósticosLoggers SLF4J estáticos controlados mediante la GameRule transitoria agrarian_reform:debug_mode

🧠 Diseño arquitectónico y tuberías de descarte rápido

┌─────────────────────────────────────────────────────────────┐
│                    CHUNK LOAD SCAN EVENT                    │
│ Palette Pre-Filter: section.hasOnlyAir() & maybeHas()       │
│ Rejects 85%+ empty non-crop sub-chunks in O(1) time         │
└──────────────────────────────┬──────────────────────────────┘


┌──────────────────────────────┴──────────────────────────────┐
│             ConcurrentLinkedQueue<CropUpdateTask>           │
│ Lock-free thread-safe task buffer                           │
└──────────────────────────────┬──────────────────────────────┘


┌──────────────────────────────┴──────────────────────────────┐
│                  ServerTickEvents.END_SERVER_TICK           │
│ Polls at most 5 tasks per tick                              │
│ Updates block states smoothly across consecutive game ticks │
└─────────────────────────────────────────────────────────────┘

¿Por qué 5 cultivos por tick?

Si un jugador descarga una granja con 10,000 cultivos durante 24 horas, aplicar 10,000 actualizaciones en un único tick provocaría una congelación de más de 1000 ms.

Al distribuir las actualizaciones a 5 cultivos por tick sin bloqueos:

  • El servidor mantiene unos sólidos 20 TPS durante la carga de chunks.
  • Los 10,000 cultivos se actualizan suavemente a lo largo de 2,000 ticks (~100 segundos) en segundo plano sin alterar la jugabilidad.

🏎️ Optimizaciones algorítmicas centrales

  1. Filtrado por paleta de sub-chunks: En lugar de examinar $98,304$ bloques, CropScanner consulta la paleta de cada sección de $16 \times 16 \times 16$. Si no contiene plantas, se descarta en $0.0001\mu\text{s}$.
  2. Anillos concéntricos de Chebyshev: La búsqueda de agua avanza de dentro hacia fuera ($r = 1 \to \text{maxRange}$). Como la mayoría de cultivos tienen agua al lado ($r=1$), se valida en el primer anillo sin evaluar las $17 \times 17$ posiciones.
  3. Descarte de pisoteo descalzo: Al pisar tierra arada, GrowthHelper.hasSoftStep() comprueba si las botas están vacías. De ser así, se omiten por completo las búsquedas de NBT.
  4. Salida temprana por madurez máxima: En bucles acelerados, el proceso finaliza inmediatamente al alcanzar la edad máxima, ahorrando mutaciones de bloques.

💾 Garantías de cero escrituras en disco

  1. Escaneo de chunks en modo lectura: La lectura inicial nunca llama a setBlockState(), manteniendo la bandera unsaved en false.
  2. Mutación selectiva de bloques: En ContinuumManager.processCropUpdate, solo se llama a setBlock() si el avance calculado $\Delta \text{age} > 0$.
  3. Protección de disco sin escritura: Al no modificarse el chunk, ChunkMap.save() omite por completo la serialización NBT y escrituras en disco ($0\text{ I/O de disco}$).

See also: El Continuo (Crecimiento offline), Hidrodinámica e irrigación, and Arquitectura y mixins.

Official documentation & web portal for Dasik Igaijinn mods.