
2026/07/05 0:49
Fable が革新的な 4D スプラッシュ形式を開発する
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
.splat4d フォーマットは、HTTP を介した低遅延ストリーミングを目的とした 4D ゴーシャンスプライトシーン用のストリーム可能で誤差範囲の制限された拡張形式です。このフォーマットは、生データのサイズを最大 58 倍削減し(gzip 圧縮と比較して 14–20 倍)、エンコード速度は約 640 MB/s です。H.265 様のクローズド GOP 構造を採用し、絶対的なキーフレームに続いてデルタ P フレームを配置することで、チャンクの独立したデコードと高速なシークを実現しています。キーフレームプレフィックスを取得するだけで、シーンを約 100–150 ミリ秒以内にレンダリングできます。圧縮は SZ/ZFP 様の量子化手法により達成され、位置(±2 mm)、色・不透明度(±4/255 レベル)、スケール(±2%)、回転(正確な値)のすべてのアトリビュートが決定論的な境界内にとどまり、デッドバンド閾値が違反されるまで動的なスプライトのみを更新することで視覚的なちらつきを防止します。静的な背景データは一度保存され、動的な変化にはこれらのデッドバンドトラックを使用してストレージコストを最小限に抑えます。MIT ライセンスの下、Rust と JavaScript デコーダーで構築されており、Windows 上の Chrome 113+、Firefox 141+、Safari 26+ で WebGPU サポートが必要です。CMU Panoptic ドーム、Neu3D、Technicolor のシーネンを用いたベンチマークでは、zstd-19 などの汎用ロスレスベースライン(圧縮率は約 2.5 倍までしか達成しない)を上回る性能を示しており、.splat4d は現代の Web ブラウザにおける没入型 3D 環境のネイティブライブストリーミングのための高効率なソリューションとなっています。本文
流可能なバインド調整機能を備えた 4D ガウススプラット形式 (splat4d
)
splat4dPyPI や 完全デモ、コード を公開中。生データに比べて 16〜58 倍、gzip に比べて 14〜20 倍 の小型化を実現し、エンコード速度は約 640MB/s。ブラウザでのライブプレビューが可能です(WebGPU 対応ブラウザで動作します)。
主な特徴とパフォーマンス
- 圧倒的な圧縮比:
- 生データと比較して 16〜58 倍 小さいサイズ。
- gzip 形式と比較しても 14〜20 倍 の効率化。
- 例:2 秒間の動的シーンがわずか 7.4 MB (
) で表現可能(元の 427 MB フレーム群の 58 分の 1)。splat4d
- 高速処理:
- エンコード速度:約 640MB/s。
- デコーダーはクライアント側でストリーミングしながらデコードするため、帯域効率が良い。
- ネイティブな範囲指定 (Range) と Seek 機能:
- HTTP リクエストの範囲指定をネイティブ対応。
- 部分的な読み込み(Partial Download)が可能で、データ転送を最小限に抑えられる。
※動作要件: WebGPU の必要があり、Chrome 113 以降、Safari 26 以降、Windows 版 Firefox 141 以降での利用が推奨されます。より多くのシーンを確認したい場合は「完全デモ」をご覧ください。
仕組みについて
静的/動的な分離
- 静的情報の圧縮:
- スプラットの大半は境界を越えず、背景として振る舞うため、一度のみ記録される静的情報として扱う。
- 1.6 GB のシーケンス全体でも、背景部分は 数 MB だけで済み、分類精度が完全に正確なまま軽量化を実現。
- 判定基準:
- 単一の量子化値がクリップ全体の最小値と最大値に対する境界を満たせば、そのスプラットは「静的」と判断される。
デッドバンド「保持(Hold)」トラック
- フリッカーの排除:
- 動的なスプラットに記録された値は、真の値が記録値に対して境界を違反するまで変化しないよう保持する。
- これにより、量子化によるフリッカー(ちらつき)を排除し、時間方向の変化量(デルタ)は主にゼロとなる。
- 保証の強制:
- このチェック自体が、各エミュートされたシンボル前に保証を強制する役割を果たす。
H.265 風のクロージング GOP
- キーフレームとデルタの構成:
- N フレームごとにキーフレーム(絶対的な量子化値)を配置し、その後正確な整数デルタを持つ P フレームが続く構造を採用。
- 独立性と迅速な表示:
- 各 GOP チャンクは独立してデコード可能で、_seek_処理において他のチャンクに影響を与えない。
- チャンク内部ではキーフレームが先頭に来るよう配置されており、スクリュー操作時にチャンクの約 10% しか取得しなくてもキーフレームを瞬時に表示できる。
エントロピースタック
- 符号化技術:
- モルテン順序付けされたスプラット、ジグザグ符号化された整数デルタ、Blosc 様式のバイトプレーンシャッフルを採用。
- 各ストリームごとの zstd 圧縮 を適用。
- 効率性:
- 出力はシンボルストリームのゼロ次エントロピーの約 100% に達し、極めて効率的なデータ密度を実現。
ファイル内部構成
splat4d ファイルは以下の 3 つの部分から成り立ちます:
- ヘッダー部:
- 境界、量子化ステップ数、および絶対バイトオフセットを持つチャンクインデックスを含む小さなヘッダー。
- クライアントがフェッチ計画を立てるために必要な全情報が記載される。
- STATIC セクション:
- 各スプラットごとのマスクと基準値を格納。
- 一度読み込むだけでシーン全体を表示可能(最初の一見全体)。
- GOP チャンク:
- 約 1 秒分のビデオに対して独立した GOP チャンクとして配置。
- 各チャンク内でキーストリームがデルタストリームより先頭に来るようになっています。
"SP4D" + ヘッダー JSON ↓ ┌───────────────────────┬───────────────────────┐ │ STATIC セクション │ GOP チャンク 0 │ │ (最初の一見全体) │ [キー][デルタ] │ └───────────────────────┴───────────────────────┘ ↓ GOP チャンク 1 ...
エラーバウンド(Bound)
デコードされたフレーム内の各スプラットの属性は、ユーザーが選択した境界以内にあることを平均的な値や PSNR のような統計指標ではなく、ポイント毎かつ決定論的に保証しています。
| 属性 | バウンド | デフォルト |
|---|---|---|
| 位置 (Position) | ± mm(軸あたり L∞) | ±2 mm |
| カラー (Color) | チャネルあたり± 8 ビットレベル | ±4/255 |
| 不透明度 (Opacity) | ± 8 ビットレベル | ±4/255 |
| 回転 (Rotation) | ± クォルターニオン成分 | 完全正確(±0) |
| スケール (Scale) | ± 軸あたり相対 % | ±2% |
メカニズム:
- SZ/ZFP 様式の誤差有界量化を採用しています。
- ステップサイズ=2×バウンド ⇒ エラー≤バウンドとして構造上の保証が得られます。
- 量子化後はすべて整数計算となるため、時間方向のデルタはドリフトすることがなく、Rust および JavaScript のデコーダーがビット単位で同一の値を再構築します。
オブジェクトストアからのストリーミング
S3 / GCS / R2 および任意の静的ホストに対する通常の HTTP Range リクエストを対象としています。サーバー側ロジックやマニフェストファイル、ビデオコンテナは一切不要です。
- ヘッダーフェッチ:
→ MAGIC + ヘッダー JSON(すべてのバイトオフセットは絶対)。bytes=0-262143 - シーン表示用: STATIC セクション用の 1 つの範囲数 MB(一度読み込むだけで画面いっぱいにシーンが表示される)。
- 再生中・プリフェッチ: GOP チャンク用範囲 1 つを各チャンクで取得。
- Seek 時: チャンクプレフィックス範囲(TOC + キーフレーム)をまず取得 → 約 100〜150ms でキーフレームが画面に表示され、その後残りのチャンクを取得して正確なフレームを表示。
サーバー設定 (CORS)
ブラウザクライアント向けには、CORS に Range ヘッダーの許可と
Content-Range の公開を設定してください:
{ "AllowedMethods": ["GET", "HEAD"], "AllowedOrigins": ["https://your-site"], "AllowedHeaders": ["Range"], "ExposeHeaders": ["Content-Range", "Content-Length", "Accept-Ranges"] }
- ペイロードについて: コンテナ内部で既に zstd 圧縮済みであるため、オブジェクトストアには
を指定する必要はありません。範囲計算がバイト単位で正確に機能し、二重圧縮が発生しないようになります。Content-Encoding
ベンチマーク
3 つの独立したキャプチャパイプラインからの 8 のシーケンス について行いました。いずれもフレームごとの
antimatter15 .splat ファイル形式(32 バイト/スプラット)を 20 fps に変換した後と比較しています。
- Dynamic 3D Gaussians: CMU Panoptic dome(ジャンブル、箱投げ、ソフトボール、テニス)。
- Neu3D クッキングシーン: SpacetimeGaussians/splaTV via(flame=屋外バーベキュー、sear=厨房のシェフ)。
- Technicolor: 誕生日パーティートーン、659k スプラット。
比較結果:
はデフォルトバウンド(±2mm / ±4 カラー / 正確な回転 / ±2% スケール)を使用。splat4d- gzip はフレームごとの
オプションで圧縮。-9 - 結論: 汎用非損失ベースラインの最高水準である「zstd-19 --long」を適用しても、最大でも 2.5 倍程度しか圧縮率を向上させることができません。詳細な手法およびその他のベースラインについては:BENCHMARKS.md を参照。
ユーザーインタラクション
- プレビュー画面:
- [Interact] ボタンを押してカメラを操作してください。
- ドラッグすると**軌道移動(オービット)**が可能。
キーを押しながらスクロールするとズームできます。Ctrl
ビューワーとパフォーマンス
生 WebGPU を使用し、
antimatter15/splat レンダラーの行ごとのポート版です。ピクセル単位の検証済み。
| メトリック | ローカル(制限 50 Mbps) |
|---|---|
| 最初の一見全体(ヘッダー + 静的セクション) | 141〜157 ms |
| バッファリングされていない領域へのスクリュー → キーフレーム表示 | ~145 ms (ほぼ即座) |
| 再生 | 60 fps @ 336k スプラット |
| · ワーカーデコード 2.5〜27ms/フレーム | |
| · ソート処理 1〜25ms |
使い方
antimatter15 の .splat フレームのタイムシリーズを、1 つ的小型で _seek_ 可能なファイルに変換します。
# Python(pip install splats4d) splat4d encode -i frames_dir -o out.splat4d
ライセンスと技術スタック
- ライセンス: MIT ライセンス
- 構築されている技術:
(形式)antimatter15/splat- Dynamic 3D Gaussians(データ)
- SZ/ZFP(誤差有界量化)
- H.264/H.265(GOP 構造)
- SPZ/SOGS(属性パッキング)
- zstd