📦 ブロックエンティティの間引き (Minecraft 26.3)
ブロックエンティティ(チェスト、エンダーチェスト、看板、旗、頭蓋骨、飾り壺、鐘、ビーコン)は動的レンダリング要素です。バニラのチャンクメッシュコンパイルをバイパスするため、毎フレーム個別の描画コールを発行します。数百個のチェストが並ぶ倉庫や自動仕分け施設では、これが深刻なGPUボトルネックの原因となります。
📋 ブロックエンティティカリング基本情報
| 項目 | 設定値 |
|---|---|
| 対象パイプライン | BlockEntityRenderDispatcher.tryExtractRenderState(...) |
| 閉塞検出 | 隣接する6面すべてをチェック: up, down, north, south, east, west |
| 保守的モード | LOW プロファイルでの完全密閉判定のみ |
| 積極的モード | MEDIUM, HIGH, SUPER での完全レイキャスト視線検証 |
| 判定結果 | RenderState として null を返し描画送信をスキップ |
🔍 閉塞判定および視線検証アーキテクチャ
text
[UP]
│
[WEST] ── [CHEST] ── [EAST]
│
[DOWN]1. 6面固体閉塞ファストパス
レイキャスト計算を行う前に、Camera Culling はまず隣接するブロック状態を照会します:
java
BlockState up = level.getBlockState(pos.above());
BlockState down = level.getBlockState(pos.below());
BlockState north = level.getBlockState(pos.north());
BlockState south = level.getBlockState(pos.south());
BlockState east = level.getBlockState(pos.east());
BlockState west = level.getBlockState(pos.west());
if (up.isSolidRender() && down.isSolidRender() && north.isSolidRender()
&& south.isSolidRender() && east.isSolidRender() && west.isSolidRender()) {
return true; // 100% 遮蔽 — 描画をスキップ
}壁の奥に埋め込まれたチェストや地下の密閉土台に囲まれたブロックエンティティは、ほぼゼロのCPU負荷($< 0.0001\mu\text{s}$)で瞬時に描画が省かれます。
2. 視線レイキャスト検証
MEDIUM, HIGH, SUPER プロファイル(cullAllBlockEntities = true)では、Camera Culling はカメラ位置からブロックエンティティの中心 $(X + 0.5, Y + 0.5, Z + 0.5)$ に向けてレイキャストを照射します:
- 対象ブロックエンティティに到達する前に不透明ブロックに衝突した場合、レンダー状態は破棄されます。
- 視線が通っている場合、ブロックエンティティは完全な視覚品質で通常通り描画されます。
