🧱 Окклюзионное отсечение сущностей (Minecraft 26.3)
В Minecraft 26.3 конвейер рендеринга сущностей клиента извлекает состояния рендеринга (EntityRenderState) для всех сущностей внутри пирамиды видимости камеры (frustum)—даже если они скрыты за горами, толстыми каменными стенами или в подземных подземельях. Camera Culling перехватывает эту проверку, предотвращая затраты ресурсов процессора на обработку геометрии и вызовов отрисовки GPU для скрытых мобов.
📋 Инфобокс отсечения сущностей
| Свойство | Значение |
|---|---|
| Целевой конвейер | EntityRenderer.shouldRender @At("HEAD") |
| Алгоритм окклюзии | Многоточечная трассировка лучей + проверка перекрытия толпой |
| Буфер задержки (Grace) | Адаптивный временной гистерезис на 4/8/12 кадров |
| Анатомические точки | 8 точек выборки (голова, глаза, верх торса, центр, 4 фланга) |
| Фильтр направления | Пол/склоны: hit.getDirection() == Direction.UP + дельта $Y \le 0.15\text{m}$ |
🔬 Многоточечная анатомическая выборка линии взгляда
Вместо упрощенной одноточечной трассировки, вызывающей мерцание мобов на углах, Camera Culling выполняет многоточечную анатомическую выборку в зависимости от выбранного профиля отсечения:
[1] Head Top (maxY - 0.05)
│
[2] Eye Level (getEyeY)
│
[3] Upper Torso (minY + height * 0.70)
│
[4] Center of Mass ((minY + maxY) * 0.5)
│
[5-8] Elevated Perimeter Flanks (width/depth checks)- Точка 1: Верх головы (
maxY - 0.05) — Высокоприоритетная проверка. Обнаруживает высоких мобов, выглядывающих из-за низких баррикад или заборов. - Точка 2: Анатомический уровень глаз (
getEyeY()) — Прямая линия взгляда от камеры к глазам моба. - Точка 3: Верхняя часть торса / грудь (
minY + height * 0.70) — Оценивает линию взгляда безопасно выше уровня земли. - Точка 4: Центр массы (
(minY + maxY) * 0.5) — Общая проверка геометрической середины. - Точки 5–8: Приподнятые периметральные фланги
- Оценивает $(X_{\min} + 0.15, Z_{\min} + 0.15)$, $(X_{\max} - 0.15, Z_{\min} + 0.15)$ и т.д. Гарантирует видимость широких боссов (например, разорителей, хранителей, пауков), когда их плечи выглядывают из-за углов.
🛡️ Направленная фильтрация пола и склонов
Когда игрок смотрит вниз на моба, стоящего на неровной местности, стандартная трассировка может попасть в верхнюю грань блока у ног моба, ошибочно приняв пол за перекрывающую стену.
Camera Culling использует направленную фильтрацию попаданий в пол: $$\text{Если } \text{hit.getDirection()} == \text{Direction.UP} \quad \text{и} \quad Y_{\text{hit} \le Y_{\text{target} + 0.15\text{m} \implies \text{Действительная линия взгляда (не заблокировано)}$$
Это гарантирует, что мобы, перемещающиеся по склонам, лестницам и неровной местности, никогда не отсекаются ошибочно.
⚡ Движок трассировки лучей с нулевым выделением памяти
В предыдущих реализациях оценка 8 точек выборки для 100 сущностей создавала более 180 000 выделений объектов new Vec3() в куче каждую секунду, что вызывало паузы сборщика мусора JVM Young-Gen.
В 26.3 CullingRaycastHelper передает примитивные координаты:
public static boolean hasLineOfSight(Level level, Vec3 from, double toX, double toY, double toZ)Передавая координаты примитивными типами double, критический цикл рендеринга полностью исключает создание временных объектов Vec3 в куче во время трассировки.
