3Dパフォーマンスの最適化
カリング
Godot はビューポート外のオブジェクトがレンダリングされないように、ビューフラスタムカリングを自動的に実行します。これは狭い領域で行われるゲームではうまく機能しますが、より大きなレベルではすぐに問題が発生する可能性があります。
オクルージョンカリング
たとえば街を歩いていると、自分が歩いている通りにある建物が数棟と、空と頭上を飛ぶ鳥が数羽しか見えないかもしれません。しかし単純なレンダラーでは、街全体を見ることができます。目の前の建物だけでなく、その後ろの通り、その通りの人々、その後ろの建物もレンダリングします。すぐに目に見えるものの 10 倍、100 倍をレンダリングしようとする状況に陥ってしまいます。
Z バッファにより、GPU は前面にあるオブジェクトのみをシェーディングできるため、状況は見た目ほど悪くはありません。これは 深度プレパス と呼ばれ、Godot で Forward+ または互換性レンダリング方法を使用する場合にデフォルトで有効になります。ただし不要なオブジェクトによってパフォーマンスは低下し続けます。
One way we can potentially reduce the amount to be rendered is to take advantage of occlusion. Godot offers an approach to occlusion culling using occluder nodes. See オクルージョンカリング for instructions on setting up occlusion culling in your scene.
注釈
場合によっては、レベル デザインを調整して、オクルージョンの機会を増やす必要があります。たとえば、プレイヤーが遠くを見すぎないようにするために壁を追加する必要がある場合がありますが、これにより、オクルージョンカリングの機会が失われ、パフォーマンスが低下します。
半透明なオブジェクト
前述したように、Godotはパフォーマンスを向上させるために、オブジェクトを Material と Shader で並べ替えます。ただし、これは半透明なオブジェクトでは実行できません。半透明なオブジェクトは後ろから前にレンダリングして、作業の背後にあるものとブレンドします。その為、半透明なオブジェクトを最小限に抑えるようにしてください!オブジェクトに透明度のある小さなセクションがある場合は、そのセクションを別のマテリアルにしてください。
詳細については GPU optimizations ページを参照してください。
レベルオブディテール (LOD)
特に遠くから見たとき 複雑なジオメトリをより単純なバージョンに置き換える のが、状況によっては良い場合があります。エンド ユーザーは、おそらく大きな違いはわかりません。遠くにある多数の木を眺めてみましょう。さまざまな距離でモデルを置き換えるには、いくつかの戦略があります。低ポリゴンモデルを使用することも、ビルボードを使用してより複雑なジオメトリをシミュレートすることもできます。
Godot 4 では、LODを制御する方法がいくつか提供されています。
Mesh level of detail (LOD) を使用したメッシュインポートの自動アプローチ。
Visibility ranges (HLOD) を使用して 3D ノードで設定する手動アプローチ。
デカール と ライト も、それぞれの Distance Fade プロパティを使用してLODの恩恵を受けることができます。
これらのアプローチは個別に使用することもできますが、組み合わせて使用すると最も効果的です。たとえば可視範囲を設定して、プレイヤーから遠すぎて気付かないパーティクルエフェクトを非表示にすることができます。同時にメッシュ LOD を利用して、パーティクル エフェクトのメッシュを離れた場所ではLODを低くしてレンダリングすることもできます。
可視範囲は、遠くのジオメトリの*偽物*を設定するのにも適した方法です (以下を参照)。
ビルボードとインポスター
半透明を使用して LOD に対処する最もシンプルな方法はビルボードです。たとえば 1 つの透明な四角形を使用して、遠くにある木を表すことができます。もちろん多数の木が互いに正面に並んでいる場合を除き、レンダリングにかかるコストは非常に低くなります。この場合、半透明によってフィル レートが損なわれる可能性があります (フィルレートの詳細については、GPUの最適化 を参照してください)。
別の方法としては、1 本の木だけではなく、複数の木をグループとしてレンダリングする方法があります。これはゲーム内でエリアが見えていても物理的に近づくことができない場合に特に効果的です。
オブジェクトのビューをさまざまな角度で事前にレンダリングすることで、インポスターを作成できます。またはさらに一歩進んで、オブジェクトのビューをテクスチャ上に定期的に再レンダリングし、インポスターとして使用することもできます。離れた場所では、ビューの角度を大幅に変更するには、ビューアーをかなりの距離移動させる必要があります。これは動作させるのが複雑になる可能性がありますが、作成しているプロジェクトの種類によっては価値がある場合があります。
Use automatic instancing
This is only implemented in the Forward+ renderer, not Mobile or Compatibility.
If you have many identical objects in your scene, you can use automatic instancing to reduce the number of draw calls. This automatically happens for MeshInstance3D nodes that use the same mesh and material: no manual setup is required.
For automatic instancing to be effective, the material must be opaque or alpha-tested (alpha scissor or alpha hash). Alpha-blended or depth pre-pass materials are never instanced this way. Instead, you must use MultiMesh as described below.
Use manual instancing (MultiMesh)
複数の同一のオブジェクトを同じ場所または近くに描画する必要がある場合は、代わりに MultiMesh を使用してみてください。 MultiMesh を使用すると、パフォーマンス コストをほとんどかけずに何千ものオブジェクトを描画できるため、群れ、草、粒子など、何千もの同一オブジェクトがあるあらゆるものに最適です。
MultiMesh の使用 ドキュメントも参照してください。
ライトの焼き込み (ベイク)
オブジェクトのライティングは、最もコストのかかるレンダリング操作の 1 つです。リアルタイムライティング、シャドウ (特に複数のライト)、および グローバルイルミネーション は特にコストがかかります。これらは、低電力のモバイル デバイスでは処理しきれないほどの負荷がかかる可能性があります。
ライティングの焼き込みを検討してください (特にモバイルの場合)。見た目は素晴らしいですが、動的ではないという欠点があります。しかし場合によっては、これは行う価値のあるトレードオフです。
ライトマップの焼き込みについては、Using Lightmap global illumination を参照してください。最高のパフォーマンスを得るには、ライトのベイクモードをデフォルトの Dynamic ではなく Static に設定する必要があります。これにより、ベイクされたライティングを持つメッシュ上のリアルタイムライティングがスキップされます。
Static ベイクモードのライトの欠点は、ベイクされたライトのあるメッシュにシャドウを落とすことができないことです。これにより、屋外環境や動的オブジェクトのあるシーンが平坦に見えることがあります。パフォーマンスと品質のバランスをとるには、DirectionalLight3D ノードに Dynamic を使用し、ほとんど (すべてではないにしても) のオムニライトとスポットライトに Static を使用します。
アニメーションとスキニング
アニメーションや頂点アニメーション (スキニングやモーフィングなど) は、一部のプラットフォームでは非常にコストがかかる場合があります。アニメーションモデルのポリゴン数を大幅に減らすか、画面に表示されるアニメーションモデルの数を制限する必要がある場合があります。遠くにあるメッシュや隠れたメッシュのアニメーションレートを下げるか、プレイヤーに気付かないようにアニメーションを完全に一時停止することもできます。
この目的には、VisibleOnScreenEnabler3D ノードと VisibleOnScreenNotifier3D ノードが役立ちます。
大規模なワールド
大規模なワールドを作成する場合は、小規模なゲームで慣れ親しんでいるものとは異なる考慮事項があります。
大規模なワールドは、ワールド内を移動する際にオンデマンドでロードできるタイルに構築する必要がある場合があります。これにより、メモリの使用が手に負えなくなるのを防ぎ、必要な処理をローカルエリアに制限できます。
大きなワールドでは浮動小数点エラーが原因でレンダリングや物理の不具合が発生することもあります。これは Large world coordinate を使って解決できます。大きなワールド座標を使用できない場合は、プレイヤーを中心にワールドを方向付ける (その逆ではなく) か、定期的に原点を移動して Vector3(0, 0, 0) を中心に維持するなどのテクニックを使用できる場合があります。