✨ パーティクルとアニメーションの間引き (Minecraft 26.1.2)
バニラの Minecraft では、地下の溶岩の雫、洞窟のパーティクル、ポータル粒子、松明などが厚い石壁の背後で何百ものクアッドを生成し、GPUに無駄に送信されています。同時に、プレイヤーがシングルプレイで一時停止中やメニュー画面を開いている最中でも、アニメーション付きブロックテクスチャアトラスは常にフレームデータをGPUにアップロードし続けます。
Camera Culling は、高速なパーティクル視線チェックとアトラスアップロード抑制メカニズムを導入しています。
📋 パーティクルとアニメーションカリング基本情報
| 項目 | 設定値 |
|---|---|
| パーティクル対象 | SingleQuadParticle.extract(QuadParticleRenderState, Camera, float) |
| アニメーション対象 | TextureAtlas.cycleAnimationFrames() |
| 近接安全マージン | カメラ周囲 4.0 メートル ($16.0\text{m}^2$) |
| 最大パーティクル距離 | 64.0 メートル ($4096.0\text{m}^2$) |
| アトラス一時停止トリガー | シングルプレイ一時停止中 または 有効なワールド/プレイヤー不在時 |
🌪️ パーティクル遮蔽パイプライン
text
(X, Y, Z) にパーティクル発生
│
▼
[1] 距離 <= 4m? ──────────────► レンダリング (近接安全バブル)
│ いいえ
▼
[2] 距離 > 64m? ──────────────► カリング (遠距離カットオフ)
│ いいえ
▼
[3] 固体ブロック内部? ────────► カリング (ブロック内閉塞)
│ いいえ
▼
[4] 視覚クリップレイキャスト遮蔽?
├── はい ─────────────► カリング (遮蔽)
└── いいえ ───────────► レンダリング (可視)- 近接安全バブル (4.0m): カメラから4メートル以内で発生したパーティクル(ポーションの渦、ダッシュの砂煙、攻撃スウィープなど)は、$< 0.0001\mu\text{s}$ の極小コストで無条件に描画されます。
- 遠距離カットオフ (64.0m): 64メートル以遠で発生したパーティクルはGPUのフィルレート負荷軽減のため自動的に間引かれます。
- 固体ブロック内閉塞: パーティクル座標
BlockPos.containing(x, y, z)がisSolidRender() == trueである場合、即座に破棄されます。 - 視覚クリップレイキャスト: カメラからパーティクル位置へ
ClipContext.Block.VISUALのレイを照射します。遮蔽ブロックが $> 0.35\text{m}$ の余裕をもって視線を遮っている場合、レンダリングをスキップします。
🎬 ブロック・テクスチャアトラスのアニメーション一時停止
テクスチャアトラスのアニメーション(シーランタン、水・溶岩の流動、プリズマリン、炎、コンパス、時計など)はフレームの更新にGPU帯域幅を消費します。
Camera Culling は TextureAtlasMixin 内で AnimationCullingHelper.shouldPauseAtlasAnimation() をチェックします:
- シングルプレイが一時停止中(
mc.isPaused() == true)の場合、アトラスのアップロードを完全に停止します。 - タイトル画面、モーダルメニュー表示中、またはワールドから切断されている場合、バックグラウンドでのテクスチャサイクルを停止します。
