パフォーマンス
スプラットのレンダリングは、CPUとGPUの両方で負荷が高くなる場合があります。良好なパフォーマンスを達成するための戦略をいくつか紹介します:
Gaussian数の制限
シーン内のGaussian数に注意してください。すべてのGaussianは毎フレームカメラの深度でソートされます。特定のGSplatアセットに含まれる数は、SuperSplat EditorのSPLAT DATA Panelを使用して確認できます。SuperSplatを使用して、PLYファイルから不要なGaussianをトリミングしてください。
大規模なシーンでは、カメラ距離に基づいて適切な詳細レベルを動的にロードするStreamed SOGの使用を検討してください。これにより、最も重要な場所で視覚品質を維持しながら、任意の時点でアクティブなGaussian数を大幅に削減できます。
フィルレートの考慮事項
3D Gaussian Splattingは、フィルレート(フラグメント操作)の観点で特に負荷が高いです。これは以下の理由によります:
- 高いオーバードロー:各Gaussianスプラットはテクスチャ付きビルボード(クワッド)としてレンダリングされ、多くの他のスプラットと重なることが多い
- 透明度ブレンディング:スプラットはスムーズな外観を実現するためにアルファブレンディングを使用し、高価なフラグメントごとのブレンディング操作が必要
- フラグメント密度:密集したスプラットクラウドでは、各最終ピクセルに対して数十から数百のフラグメントが処理される可能性がある
この高いフラグメントコストが、3DGSパフォーマンスにおいてピクセル数とレンダリング設定の最適化が重要である理由です。
シーン設定の構成
Gaussian splattingのフラグメント重視の性質を考えると、これらの設定はパフォーマンスに大きな影響を与えます:
Anti-Aliasを無効にする:アンチエイリアシングはピクセルごとに処理されるフラグメント数を増加させ、スプラットレンダリングでは特にコストがかかるDevice Pixel Ratioを無効にする:これにより全体的なピクセル解像度が下がり、処理が必要なフラグメント数が直接削減される
両方の設定は、3DGSレンダリングの主なボトルネックであるフラグメント処理負荷の削減に役立ちます。
Streamed SOG設定
Streamed SOGを使用する場合、品質とパフォーマンスを制御するためのいくつかのオプションがあります。推奨されるアプローチは、シーン内のすべてのGSplatアセットのLOD選択を自動的に管理するグローバルスプラットバジェットを使用することです。
グローバルスプラットバジェット
グローバルスプラットバジェットは、Streamed SOGのレンダリングパフォーマンスを制御する主要な方法です。常に有効で、デフォルトは100万スプラットです。以下のように設定します:
app.scene.gsplat.splatBudget = 4000000; // 最大400万スプラット
エンジンはバジェット内に収まるようにすべてのGSplatアセットのLODレベルを自動的に調整し、画質への貢献が最も大きい場所に予算を割り当てます。通常は近くのジオメトリを細かい詳細レベルに保ち、遠くのジオメトリから先に品質を下げます。これにより、潜在的に表示可能なスプラット数に関係なく、一貫した処理負荷が維持されます。
バジェットシステムは、Streamed SOGアセット(複数の詳細レベルを持つ)と固定アセット(単一の詳細レベル)の両方を含む、シーン内のすべてのGSplatアセットを考慮します。
LODモードとフォールオフ
バジェットの範囲内では、デフォルトで測定された視覚的誤差に基づいてLODレベルが選択されます。これを微調整する2つのプロパティがあります。app.scene.gsplatのlodModeはシーン全体を明確な同心円状の距離バンドによる選択に切り替えられ、各gsplatコンポーネントのlodFalloffはそのスプラットの詳細を近景と遠景の間で傾けられます:
app.scene.gsplat.lodMode = pc.GSPLAT_LODMODE_DISTANCE;
entity.gsplat.lodFalloff = 2; // カメラ付近の詳細を増やし、遠方の詳細を減らす
詳細はLOD動作の制御を参照してください。LOD選択はカメラの視野角(FOV)も自動的に補正します。視野角が広いほどオブジェクトは画面上で小さく見えるため、より早く粗いレベルに切り替わります。
LOD範囲制限
gsplatコンポーネントのlodRangeMinとlodRangeMax設定は、そのスプラットが使用可能なLODレベルを制限します:
entity.gsplat.lodRangeMin = 0; // 最高品質のLODを許可
entity.gsplat.lodRangeMax = 3; // LOD 3より低くはしない
これらの設定は以下の場合に役立ちます:
- ダウンロードの削減:インターネット接続が遅いデバイスでは、
lodRangeMinを高く設定することで、最高品質(かつ最大サイズ)のLODファイルのダウンロードを防ぐことができます - メモリ制約:LOD範囲を制限することで、特定の詳細レベルの読み込みを避け、メモリ使用量を削減できます
ただし、一般的なレンダリングパフォーマンス管理には、LOD範囲制限よりもグローバルスプラットバジェットの方が効果的です。バジェットはすべてのアセット間で適切なバランスを自動的に見つけますが、LOD範囲制限はカメラ位置やシーン構成に関係なくアセットごとに適用されます。
最初のフレームを高速に表示する
大規模なストリーミングシーンでは、最初に最も低い(最も粗い)詳細レベルだけをロードし、その後により高い詳細レベルをストリーミングで読み込むことで、ほぼ即座にレンダリング結果を表示できます。これにより、何かが画面に表示される前に高品質データの読み込みを待つ必要がなくなります。
この手法は2つのステップで構成されます:
- GSplatアセットの作成時に、LOD範囲を最も粗いレベルのみに制限し、最小限のデータだけが先にロードされるようにします。
- GSplatシステムの
frame:readyイベントをリッスンします。粗いデータがロードされてレンダリングされ、かつ読み込み中のものがなくなったら、LOD範囲を元に戻し、カメラ距離に基づいてより高い詳細レベルがストリーミングされるようにします。
const gsplatSystem = app.systems.gsplat;
// `entity` は、ロード済みのStreamed SOGアセットを使用する gsplat コンポーネントを持ちます
const gsplat = entity.gsplat;
// 1. 最初のフレームを最速にするため、最も低い(最も粗い)LODのみで開始
const lodLevels = gsplat.resource?.octree?.lodLevels;
if (lodLevels) {
const worstLod = lodLevels - 1;
gsplat.lodRangeMin = worstLod;
gsplat.lodRangeMax = worstLod;
}
// 2. 粗いデータがロードされてレンダリングされたら、LOD範囲を元に戻して
// より高い詳細レベルをストリーミングする
const onFrameReady = (camera, layer, ready, loadingCount) => {
if (ready && loadingCount === 0) {
gsplatSystem.off('frame:ready', onFrameReady);
// 完全なLOD範囲を復元(0 = 最高詳細)
gsplat.lodRangeMin = 0;
gsplat.lodRangeMax = lodLevels - 1;
}
};
gsplatSystem.on('frame:ready', onFrameReady);
この手法は、ライブのStreamed SOGサンプルで実演されています。
推奨設定
ほとんどのアプリケーションでは:
- ターゲットハードウェアに適したグローバルスプラットバジェットを設定します(例:モバイルでは100万、デスクトップでは300万以上)
- 特定のダウンロードやメモリの制約がない限り、LOD範囲はデフォルトのままにします(min=0、max=利用可能な最高値)
- 特定の距離での品質遷移をより細かく制御したい場合は、LOD距離を調整します