✨ Culling Oklusi Partikel & Animasi (Minecraft 26.2)
Dalam vanilla Minecraft, tetesan lava bawah tanah, debu gua, partikel portal, dan obor menghasilkan ratusan quad partikel di balik dinding batu solid yang tetap dikirimkan ke GPU. Bersamaan dengan itu, atlas tekstur blok beranimasi terus mengunggah data frame ke GPU bahkan ketika pemain menjeda game dalam mode singleplayer atau membuka menu modal.
Camera Culling memperkenalkan pemeriksaan garis pandang partikel berkecepatan tinggi dan penekanan unggahan atlas tekstur.
📋 Informasi Singkat Culling Partikel & Animasi
| Properti | Nilai |
|---|---|
| Target Partikel | SingleQuadParticle.extract(QuadParticleRenderState, Camera, float) |
| Target Animasi | TextureAtlas.cycleAnimationFrames() |
| Keamanan Proksimitas | 4.0 meter ($16.0\text{m}^2$) di sekitar kamera |
| Jarak Maks Partikel | 64.0 meter ($4096.0\text{m}^2$) |
| Pemicu Jeda Atlas | Game singleplayer dijeda ATAU tidak ada level/pemain aktif |
🌪️ Pipeline Oklusi Partikel
text
Partikel Dihasilkan di (X, Y, Z)
│
▼
[1] Jarak <= 4m? ─────────────► RENDER (Gelembung Proksimitas)
│ Tidak
▼
[2] Jarak > 64m? ─────────────► CULL (Batas Jarak Jauh)
│ Tidak
▼
[3] Di Dalam Blok Solid? ─────► CULL (Terkurung)
│ Tidak
▼
[4] Raycast Klip Visual Terhalang?
├── Ya ───────────────► CULL (Terhalang)
└── Tidak ────────────► RENDER (Terlihat)- Gelembung Keamanan Proksimitas (4.0m): Partikel yang dipancarkan dalam jarak 4 meter dari kamera di-render tanpa syarat dalam waktu $< 0.0001\mu\text{s}$.
- Batas Jarak Jauh (64.0m): Partikel yang dihasilkan di luar radius 64 meter di-cull untuk melindungi fillrate quad GPU.
- Pengurungan Blok Solid: Jika koordinat blok
BlockPos.containing(x, y, z)memilikiisSolidRender() == true, partikel langsung diabaikan. - Raycast Klip Visual: Memproyeksikan sinar
ClipContext.Block.VISUALdari posisi kamera ke vektor partikel. Jika ada blok solid kedap cahaya yang memotong garis pandang dengan margin $> 0.35\text{m}$, proses render dilewati.
🎬 Pembekuan Animasi Blok & Atlas Tekstur
Animasi atlas tekstur (lentera laut beranimasi, air/lava mengalir, prismarine, api, kompas, jam) mengonsumsi bandwidth GPU untuk menggilir indeks frame.
Camera Culling memeriksa AnimationCullingHelper.shouldPauseAtlasAnimation() dalam TextureAtlasMixin:
- Jika singleplayer dijeda (
mc.isPaused() == true), unggahan data atlas akan dibekukan. - Saat berada di layar judul, di menu modal, atau terputus dari dunia, pergantian tekstur latar belakang dihentikan.
