🧱 Culling Oklusi Entitas (Minecraft 26.1.2)
Dalam Minecraft 26.1.2, rendering entitas klien mengekstrak render state untuk semua entitas di dalam frustum kamera—bahkan saat tersembunyi di balik gua, tebing, atau bangunan. Camera Culling mencegat pemeriksaan ini untuk mencegah mob yang terhalang mengonsumsi pemrosesan geometri CPU dan draw call GPU.
📋 Informasi Singkat Culling Entitas
| Properti | Nilai |
|---|---|
| Target Pipeline | EntityRenderer.shouldRender(T, Frustum, double, double, double) |
| Profil Bawaan | SUPER (Ekstrem) |
| Konteks Klip | ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE |
| Filter Lantai | Mengabaikan tabrakan Direction.UP ketika tinggi tabrakan $\le Y + 0.15\text{m}$ |
| Oklusi Daun | Render solid dan blok BlockTags.LEAVES menghalangi garis pandang |
| Gelembung Imunitas | Jarak kuadrat $< \text{minDistanceSq}$ |
🔬 Pengambilan Sampel Garis Pandang Anatomis Multi-Titik
Camera Culling melakukan pengambilan sampel anatomis multi-titik berdasarkan Profil Culling yang dipilih:
[1] Puncak Kepala (maxY - 0.05)
\
[2] Posisi Mata (entity.getEyeY())
\
[3] Tubuh Bagian Atas (minY + height * 0.70)
\
[4] Pusat Massa (centerY)
\
[5-8] Sisi Flank Perimeter Terangkat (pemeriksaan lebar/kedalaman)- Sampel 1: Bagian Atas Kepala Entitas (
maxY - 0.05)- Pemeriksaan prioritas tinggi. Mendeteksi entitas tinggi yang mengintip di balik barikade rendah atau pagar.
- Sampel 2: Posisi Mata Anatomis (
getEyeY())- Garis pandang langsung dari kamera ke mata mob.
- Sampel 3: Tubuh Bagian Atas / Dada (
minY + height * 0.70)- Mengevaluasi garis pandang tubuh bagian atas secara aman di atas permukaan tanah.
- Sampel 4: Pusat Massa (
(minY + maxY) * 0.5)- Uji titik tengah geometris umum.
- Sampel 5–8: Sisi Flank Perimeter Terangkat
- Mengevaluasi $(X_{\min} + 0.15, Z_{\min} + 0.15)$, $(X_{\max} - 0.15, Z_{\min} + 0.15)$, dll. Memastikan bos bertubuh lebar (misalnya Ravager, Warden, Laba-laba) tetap terlihat saat pundak mereka muncul dari balik sudut dinding.
🛡️ Pemfilteran Lantai & Lereng Berarah
Saat pemain melihat ke bawah ke arah mob yang berdiri di medan tidak rata, raycast standar dapat menabrak permukaan atas blok di dekat kaki mob, dan secara keliru menganggap lantai sebagai dinding penghalang.
Camera Culling menerapkan Pemfilteran Tabrakan Lantai Berarah: $$\text{Jika } \text{hit.getDirection()} == \text{Direction.UP} \quad \text{dan} \quad Y_{\text{hit} \le Y_{\text{target} + 0.15\text{m} \implies \text{Garis Pandang Valid (Tidak Terhalang)}$$
Ini menjamin bahwa mob yang melintasi bukit, tangga, dan medan tidak rata tidak akan pernah di-cull secara keliru.
⚡ Mesin Raycast Tanpa Alokasi
Pada implementasi terdahulu, mengevaluasi 8 titik sampel pada 100 entitas menghasilkan lebih dari 180.000 alokasi heap new Vec3() per detik, yang memicu jeda garbage collection Young-Gen JVM.
Dalam 26.1.2, CullingRaycastHelper meneruskan koordinat primitif mentah:
public static boolean hasLineOfSight(Level level, Vec3 from, double toX, double toY, double toZ)Arsitektur ini sepenuhnya menghilangkan alokasi heap perantara pada setiap frame.
