Skip to content

🧱 Окклюзионное отсечение сущностей (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 выполняет многоточечную анатомическую выборку в зависимости от выбранного профиля отсечения:

text
       [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. Точка 1: Верх головы (maxY - 0.05) — Высокоприоритетная проверка. Обнаруживает высоких мобов, выглядывающих из-за низких баррикад или заборов.
  2. Точка 2: Анатомический уровень глаз (getEyeY()) — Прямая линия взгляда от камеры к глазам моба.
  3. Точка 3: Верхняя часть торса / грудь (minY + height * 0.70) — Оценивает линию взгляда безопасно выше уровня земли.
  4. Точка 4: Центр массы ((minY + maxY) * 0.5) — Общая проверка геометрической середины.
  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 передает примитивные координаты:

java
public static boolean hasLineOfSight(Level level, Vec3 from, double toX, double toY, double toZ)

Передавая координаты примитивными типами double, критический цикл рендеринга полностью исключает создание временных объектов Vec3 в куче во время трассировки.


🔗 Связанные страницы ​

Official documentation & web portal for Dasik Igaijinn mods.