🧱 Entitäts-Okklusions-Culling (Minecraft 26.2)
In Minecraft 26.2 extrahiert die clientseitige Entitäts-Rendering-Pipeline Render-Zustände (EntityRenderState) für alle Entitäten innerhalb des Kamera-Sichtkegels (Frustum) – selbst wenn diese hinter Bergen, dicken Steinmauern oder in unterirdischen Höhlen verborgen sind. Camera Culling fängt diese Prüfung ab, um zu verhindern, dass verdeckte Mobs unnötige CPU-Geometrieberechnungen und GPU-Draw-Calls verursachen.
📋 Entitäts-Culling-Kurzübersicht
| Eigenschaft | Wert |
|---|---|
| Ziel-Pipeline | EntityRenderer.shouldRender(T, Frustum, double, double, double) |
| Standardprofil | SUPER (Extrem) |
| Clip-Kontext | ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE |
| Bodenfilterung | Ignoriert Direction.UP-Treffer, wenn Trefferhöhe $\le Y + 0.15\text{m}$ |
| Immunitätsblase | Distanzquadrat $< \text{minDistanceSq}$ |
🔬 Anatomisches Mehrpunkt-Sichtlinien-Sampling
Anstelle eines einfachen Ein-Punkt-Raycasts, der dazu führen kann, dass Mobs an Blockkanten plötzlich aufploppen oder verschwinden, führt Camera Culling ein anatomisches Mehrpunkt-Sampling basierend auf dem gewählten Culling-Profil durch:
[1] Scheitelpunkt des Kopfes (maxY - 0.05)
\
[2] Augenposition (entity.getEyeY())
\
[3] Oberkörper / Brust (minY + height * 0.70)
\
[4] Massenschwerpunkt (centerY)
\
[5-8] Erhöhte Außenflanken (Breiten-/Tiefenprüfungen)- Abtastpunkt 1: Scheitelpunkt des Kopfes (
maxY - 0.05)- Prüfung mit hoher Priorität. Erkennt hohe Entitäten, die über niedrige Barrikaden oder Zäune blicken.
- Abtastpunkt 2: Anatomische Augenposition (
getEyeY())- Direkte Sichtlinie von der Kamera zu den Augen des Mobs.
- Abtastpunkt 3: Oberkörper / Brustkorb (
minY + height * 0.70)- Bewertet Sichtlinien auf den Oberkörper sicher über Bodenhöhe.
- Abtastpunkt 4: Massenschwerpunkt (
(minY + maxY) * 0.5)- Allgemeiner geometrischer Mittelpunkttest.
- Abtastpunkte 5–8: Erhöhte Außenflanken
- Bewertet $(X_{\min} + 0.15, Z_{\min} + 0.15)$, $(X_{\max} - 0.15, Z_{\min} + 0.15)$ usw. Stellt sicher, dass breite Bosse (z. B. Verwüster, Warden, Spinnen) sichtbar sind, sobald ihre Schultern hinter Kanten hervortreten.
🛡️ Direktionales Boden- & Hang-Filtering
Wenn ein Spieler schräg nach unten auf einen Mob blickt, der auf unebenem Gelände steht, kann ein standardmäßiger Raycast auf die Oberseite eines Blocks nahe den Füßen des Mobs treffen und den Boden fälschlicherweise als verdeckende Wand einstufen.
Camera Culling integriert daher ein direktionales Boden-Treffer-Filtering: $$\text{Wenn } \text{hit.getDirection()} == \text{Direction.UP} \quad \text{und} \quad Y_{\text{Treffer} \le Y_{\text{Ziel} + 0.15\text{m} \implies \text{Gültige Sichtlinie (Nicht blockiert)}$$
Dies stellt sicher, dass Mobs auf Hügeln, Treppen und unebenem Terrain niemals fälschlicherweise ausgeblendet werden.
⚡ Zero-Allocation-Raycast-Engine
In früheren Implementierungen erzeugte die Auswertung von 8 Abtastpunkten bei 100 Entitäten über 180.000 new Vec3()-Heap-Allokationen pro Sekunde, was zu regelmäßigen JVM Young-Gen Garbage-Collection-Pausen führte.
In 26.2 übergibt CullingRaycastHelper direkt primitive Koordinaten:
public static boolean hasLineOfSight(Level level, Vec3 from, double toX, double toY, double toZ)Diese Architektur eliminiert Zwischenallokationen auf dem Heap in jedem Frame vollständig.
