🧱 엔티티 차폐 컬링 (Minecraft 26.3)
Minecraft 26.3에서 클라이언트 엔티티 렌더링 파이프라인은 카메라 프러스텀(절두체) 내에 있는 모든 엔티티의 렌더 상태(EntityRenderState)를 추출합니다. 산, 두꺼운 돌벽, 또는 지하 던전 뒤에 완전히 가려져 있더라도 예외가 아닙니다. Camera Culling은 이 검사를 가로채어 차폐된 몹이 CPU 지오메트리 처리와 GPU 드로우 콜을 낭비하지 않도록 방지합니다.
📋 엔티티 컬링 기본 정보
| 속성 | 값 |
|---|---|
| 대상 파이프라인 | EntityRenderer.shouldRender(T, Frustum, double, double, double) |
| 기본 프로필 | SUPER (극한) |
| 클립 컨텍스트 | ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE |
| 바닥 필터링 | 충돌 높이가 $\le Y + 0.15\text{m}$일 때 Direction.UP 충돌 무시 |
| 나뭇잎 차폐 | 솔리드 렌더 및 BlockTags.LEAVES 블록이 시선을 차폐함 |
| 면제 버블 | 거리 제곱 $< \text{minDistanceSq}$ |
🔬 다중 지점 해부학적 시선 샘플링
모퉁이 주변에서 몹이 갑자기 나타나거나 사라지는 현상을 유발하는 단순 단일 지점 레이캐스트 대신, Camera Culling은 선택된 컬링 프로필에 따라 다중 지점 해부학적 샘플링을 수행합니다:
[1] 머리 상단 (maxY - 0.05)
\
[2] 안구 위치 (entity.getEyeY())
\
[3] 상체 / 가슴 (minY + height * 0.70)
\
[4] 기하학적 중심 (centerY)
\
[5-8] 외곽 측면 샘플링 (너비/깊이 검사)- 샘플 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{유효한 시선 (차폐되지 않음)}$$
이를 통해 언덕, 계단 및 불규칙한 지형을 이동하는 몹이 잘못 컬링되는 현상을 완전히 방지합니다.
⚡ 제로 할당 레이캐스트 엔진
이전 구현에서는 100개의 엔티티에 대해 8개의 샘플 지점을 평가할 때 초당 180,000개 이상의 new Vec3() 힙 할당이 발생하여 JVM Young-Gen 가비지 컬렉션 일시 중단을 유발했습니다.
26.3에서는 CullingRaycastHelper가 원시 기본형 좌표를 직접 전달합니다:
public static boolean hasLineOfSight(Level level, Vec3 from, double toX, double toY, double toZ)이 아키텍처는 매 프레임 발생하는 중간 힙 할당을 완전히 제거합니다.
