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.