Skip to content

⚡ Leistungs- und Warteschlangen-Drosselungs-Engine

Agrarian Reform wurde für Hochleistungsserver optimiert und verarbeitet riesige Megafarmen ohne Lag-Spikes oder TPS-Einbrüche.


📊 Leistung Infobox

PropertyValue
Global Throttling BudgetCROPS_PER_TICK = 5
Queue Implementationjava.util.concurrent.ConcurrentLinkedQueue
Sub-Chunk Palette FilterhasOnlyAir() & maybeHas(AgrarianCropRules::isCropBlock)
WassersucheKonzentrische Tschebyschow-Ringe ($r=1 \to \text{maxRange}$, sofortiger Abbruch bei nahem Wasser)
Schuh-OptimierungBarfuß-Schnellprüfung ($0.0001\mu\text{s}$, überspringt NBT-Verzauberungsabfragen)
DiagnoseprotokolleStatische SLF4J-Logger gesteuert über die temporäre Spielregel agrarian_reform:debug_mode

🧠 Architekturdesign & Schnellprüfungsketten

┌─────────────────────────────────────────────────────────────┐
│                    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 │
└─────────────────────────────────────────────────────────────┘

Warum 5 Pflanzen pro Tick?

Wenn ein Spieler nach 24 Stunden eine Farm mit 10.000 Pflanzen betritt, würde die sofortige Aktualisierung aller Blöcke zu einem Serverstillstand von über 1000 ms führen.

Durch die gleichmäßige Verteilung auf 5 Pflanzen pro Tick:

  • Behält der Server während des Ladens stabile 20 TPS bei.
  • Aktualisieren sich 10.000 Pflanzen sanft über 2.000 Ticks (~100 Sekunden) im Hintergrund ohne Beeinträchtigung des Spielablaufs.

🏎️ Zentrale Schnellprüfungen & Algorithmen

  1. Sub-Chunk-Palettenfilter: Anstatt alle $98.304$ Blöcke zu prüfen, liest CropScanner die Paletten der $16 \times 16 \times 16$-Bereiche. Enthält ein Abschnitt keine Pflanzen, wird er in $0.0001\mu\text{s}$ übersprungen.
  2. Konzentrische Tschebyschow-Ringe: Die Prüfung verläuft von innen nach außen ($r = 1 \to \text{maxRange}$). Da Wasser meist direkt anliegt ($r=1$), stoppt die Suche sofort nach Ring 1.
  3. Barfuß-Trampelschutz-Optimierung: Betritt eine Einheit Ackerland, prüft hasSoftStep() zunächst den Fußslot. Ist er leer, entfallen aufwendige NBT-Suchen komplett.
  4. Vorzeitiger Abbruch bei Reife: In beschleunigten Schleifen bricht der Vorgang sofort ab, wenn die maximale Stufe erreicht ist.

💾 Null-Festplatten-Schreibgarantien

  1. Nur-Lese-Chunk-Scans: Der anfängliche Scan ruft niemals setBlockState() auf, sodass Chunks intern unsaved == false bleiben.
  2. Gezielte Blockaktualisierung: In ContinuumManager.processCropUpdate wird setBlock() nur bei echtem Fortschritt $\Delta \text{age} > 0$ ausgeführt.
  3. Null-Festplatten-Schutz: Unveränderte Chunks behalten unsaved == false, wodurch ChunkMap.save() NBT-Speicherungen komplett überspringt ($0\text{ Disk-I/O}$).

See also: Das Kontinuum (Offline-Wachstum), Hydrodynamik und Bewässerung, and Architektur und Mixin-Ziele.

Official documentation & web portal for Dasik Igaijinn mods.