✨ Отсечение частиц и анимаций (Minecraft 26.1.2)
В ванильном Minecraft капли подземной лавы, пещерная пыль, частицы порталов и факелов создают сотни полигонов частиц за сплошными каменными стенами, которые отправляются на отрисовку в GPU. Одновременно с этим анимированные текстурные атласы блоков непрерывно передают кадры в GPU, даже когда игрок находится на паузе в одиночной игре или в модальных меню.
Camera Culling решает обе проблемы с помощью эффективного отсечения на стороне клиента.
📋 Инфобокс отсечения частиц
| Свойство | Значение |
|---|---|
| Зона безопасности близости | Безусловный рендеринг при расстоянии $\le 4.0\text{м}$ |
| Дальняя граница отсечения | Частицы на расстоянии $> 64.0\text{м}$ сбрасываются |
| Конвейер трассировки лучей | SingleQuadParticle.extract(...) @At("HEAD") |
| Хук анимации атласов | TextureAtlasMixin.cycleAnimationFrames |
🫧 Конвейер проверки линии взгляда частиц
text
Particle Generated
│
├── Distance <= 4.0m? ──────► RENDER (Safety Bubble)
│
├── Distance > 64.0m? ──────► CULL (Too Far)
│
├── Block is SolidRender? ──► CULL (Inside Solid Geometry)
│
└── Visual Raycast Blocked?
├── Yes ──────────────► CULL (Behind Walls)
└── No ───────────────► RENDER (Visible)- Зона безопасности близости (4.0м): Частицы, созданные в пределах 4 метров от камеры, отрисовываются безусловно за $< 0.0001\mu\text{s}$.
- Дальняя граница отсечения (64.0м): Частицы за пределами 64 метров отсекаются для защиты скорости заполнения GPU.
- Окружение твердым блоком: Если координаты блока
BlockPos.containing(x, y, z)имеютisSolidRender() == true, частица немедленно отбрасывается. - Трассировка визуального луча: Проецирует луч
ClipContext.Block.VISUALиз позиции камеры к вектору частицы. Если непрозрачный твердый блок пересекает линию взгляда с запасом $> 0.35\text{м}$, рендеринг пропускается.
🎬 Заморозка анимаций блоков и текстурных атласов
Анимации текстурных атласов потребляют пропускную способность GPU для переключения кадров.
Camera Culling вызывает AnimationCullingHelper.shouldPauseAtlasAnimation() в TextureAtlasMixin:
- Если одиночная игра приостановлена (
mc.isPaused() == true), загрузка атласов замораживается. - Если открыты полноэкранные модальные экраны меню (инвентарь, настройки), анимации приостанавливаются, экономя такты GPU.
