⚡ 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
| Property | Value |
|---|---|
| Global Throttling Budget | CROPS_PER_TICK = 5 |
| Queue Implementation | java.util.concurrent.ConcurrentLinkedQueue |
| Sub-Chunk Palette Filter | hasOnlyAir() & maybeHas(AgrarianCropRules::isCropBlock) |
| Wassersuche | Konzentrische Tschebyschow-Ringe ($r=1 \to \text{maxRange}$, sofortiger Abbruch bei nahem Wasser) |
| Schuh-Optimierung | Barfuß-Schnellprüfung ($0.0001\mu\text{s}$, überspringt NBT-Verzauberungsabfragen) |
| Diagnoseprotokolle | Statische 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
- Sub-Chunk-Palettenfilter: Anstatt alle $98.304$ Blöcke zu prüfen, liest
CropScannerdie Paletten der $16 \times 16 \times 16$-Bereiche. Enthält ein Abschnitt keine Pflanzen, wird er in $0.0001\mu\text{s}$ übersprungen. - 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.
- Barfuß-Trampelschutz-Optimierung: Betritt eine Einheit Ackerland, prüft
hasSoftStep()zunächst den Fußslot. Ist er leer, entfallen aufwendige NBT-Suchen komplett. - Vorzeitiger Abbruch bei Reife: In beschleunigten Schleifen bricht der Vorgang sofort ab, wenn die maximale Stufe erreicht ist.
💾 Null-Festplatten-Schreibgarantien
- Nur-Lese-Chunk-Scans: Der anfängliche Scan ruft niemals
setBlockState()auf, sodass Chunks internunsaved == falsebleiben. - Gezielte Blockaktualisierung: In
ContinuumManager.processCropUpdatewirdsetBlock()nur bei echtem Fortschritt $\Delta \text{age} > 0$ ausgeführt. - Null-Festplatten-Schutz: Unveränderte Chunks behalten
unsaved == false, wodurchChunkMap.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.
