⚡ Performa & Mesin Pembatasan Antrean
Agrarian Reform dirancang khusus untuk server berkinerja tinggi, mampu menangani lahan pertanian raksasa tanpa lonjakan lag atau penurunan TPS.
📊 Infobox Performa
| Property | Value |
|---|---|
| Global Throttling Budget | CROPS_PER_TICK = 5 |
| Queue Implementation | java.util.concurrent.ConcurrentLinkedQueue |
| Sub-Chunk Palette Filter | hasOnlyAir() & maybeHas(AgrarianCropRules::isCropBlock) |
| Pencarian Air | Cincin konsentris Chebyshev ($r=1 \to \text{maxRange}$, deteksi kilat jika air dekat) |
| Optimasi Sepatu | Deteksi kilat telanjang kaki ($0.0001\mu\text{s}$, lewati pengecekan NBT enchantment) |
| Log Diagnostik | Logger statis SLF4J yang dikendalikan oleh GameRule sementara agrarian_reform:debug_mode |
🧠 Desain Arsitektur & Pipeline Fast-Fail
┌─────────────────────────────────────────────────────────────┐
│ 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 │
└─────────────────────────────────────────────────────────────┘Mengapa 5 Tanaman Per Tick?
Jika pemain meninggalkan lahan dengan 10.000 tanaman selama 24 jam, memperbarui 10.000 tanaman dalam 1 tick akan menyebabkan server hang lebih dari 1000 ms.
Dengan mendistribusikan pembaruan secara bertahap pada 5 tanaman per tick:
- Server tetap mempertahankan stabilitas di angka 20 TPS saat chunk dimuat.
- 10.000 tanaman terbarui secara halus dalam 2.000 tick (~100 detik) di latar belakang tanpa mengganggu jalannya game.
🏎️ Optimasi Algoritma & Fast-Fail Utama
- Penyaringan Palet Sub-Chunk: Alih-alih mengecek $98.304$ koordinat blok,
CropScannermemeriksa palet sub-chunk $16 \times 16 \times 16$. Jika tidak ada tanaman, bagian tersebut dilewati dalam $0.0001\mu\text{s}$. - Pencarian Melingkar Chebyshev: Pencarian air dilakukan dari ring terdalam ($r = 1 \to \text{maxRange}$). Karena air umumnya berada tepat di sebelah tanaman ($r=1$), pencarian langsung selesai di ring pertama.
- Cek Cepat Tanpa Alas Kaki: Saat entitas menginjak lahan pertanian,
hasSoftStep()memeriksa apakah sepatu kosong. Jika kosong, pengecekan NBT yang berat langsung dilewati. - Berhenti Saat Maksimal: Pada putaran pertumbuhan cepat, proses langsung berhenti seketika tanaman mencapai usia maksimal guna menghemat resource blok.
💾 Jaminan Nol Penulisan Disk & Status Dirty
- Pemindaian Chunk Hanya-Baca: Pemindaian awal tidak pernah memodifikasi blok sehingga flag
unsavedtetap berstatusfalse. - Modifikasi Blok Selektif: Di dalam
ContinuumManager.processCropUpdate,setBlock()hanya dipanggil jika pertumbuhan nyata $\Delta \text{age} > 0$. - Pencegahan Tulis Harddisk: Karena chunk tetap berstatus
unsaved == false, Minecraft otomatis melewati serialisasi NBT dan penulisan ke disk ($0\text{ Disk I/O}$).
See also: The Continuum (Pertumbuhan Luar Jaringan), Dinamika Air & Irigasi Lanjutan, and Arsitektur & Target Mixin.
