アニメーション メモリの使用量を最小に抑えるには、次の点を考慮します。
アニメーションのストリーミングはサポートされていません。
ゲームの実行中に、次のコンソール コマンドを使用できます。
memory_resources list animation
ロードされたアニメーション リソースと、これらのサイズのリストを取得するには:
13:41:40.61 [Application] Obtaining resource statistics. This may take a while... 13:41:40.61 [Application] ----------------------------------------------------------------------- 13:41:40.61 [Application] 19 kB - units/character/animations/onground/revolver/walk/aim/180 13:41:40.61 [Application] 17 kB - units/character/animations/onground/revolver/run/aim/180 13:41:40.61 [Application] 17 kB - units/character/animations/onground/revolver/run/aim/-90 13:41:40.61 [Application] 17 kB - units/character/animations/onground/revolver/run/aim/90 13:41:40.61 [Application] 17 kB - units/character/animations/onground/revolver/run/aim/0 13:41:40.61 [Application] 16 kB - units/character/animations/onground/revolver/run/aim/-180 13:41:40.61 [Application] 16 kB - units/character/animations/onground/unarmed/walk_fwd_lean_left 13:41:40.61 [Application] 16 kB - units/character/animations/onground/unarmed/walk_fwd_lean_right 13:41:40.61 [Application] 16 kB - units/character/animations/onground/unarmed/walk/fwd/0 13:41:40.61 [Application] 16 kB - units/character/animations/onground/revolver/walk/aim/270 13:41:40.61 [Application] 15 kB - units/character/animations/onground/revolver/walk/aim/-90 13:41:40.61 [Application] 15 kB - units/character/animations/onground/revolver/walk/aim/0 13:41:40.61 [Application] 15 kB - units/character/animations/onground/revolver/walk/aim/90 13:41:40.61 [Application] 14 kB - units/character/animations/onground/unarmed/run/fwd/lean/right 13:41:40.61 [Application] 14 kB - units/character/animations/onground/unarmed/run/fwd/lean/left 13:41:40.61 [Application] 14 kB - units/character/animations/onground/unarmed/jog/fwd/0 13:41:40.61 [Application] 14 kB - units/character/animations/onground/unarmed/jog/fwd/lean/right 13:41:40.61 [Application] 14 kB - units/character/animations/onground/unarmed/run/fwd/0 13:41:40.61 [Application] 14 kB - units/character/animations/onground/unarmed/jog/fwd/lean/left 13:41:40.61 [Application] 13 kB - units/character/animations/onground/revolver/jog/aim/180 13:41:40.61 [Application] 13 kB - units/character/animations/onground/revolver/jog/aim/90 13:41:40.61 [Application] 13 kB - units/character/animations/onground/revolver/jog/aim/270 13:41:40.61 [Application] 12 kB - units/character/animations/onground/revolver/jog/aim/0 13:41:40.61 [Application] 12 kB - units/character/animations/onground/revolver/jog/aim/-90 13:41:40.61 [Application] 7 kB - units/character/animations/onground/unarmed/idle/0 13:41:40.61 [Application] 7 kB - units/character/animations/onground/revolver/idle 13:41:40.61 [Application] 6 kB - units/character/animations/onground/revolver/idle/aim/-90 13:41:40.61 [Application] 6 kB - units/character/animations/onground/revolver/idle/aim/0 13:41:40.61 [Application] 6 kB - units/character/animations/onground/revolver/idle/aim/90 13:41:40.61 [Application] 3 kB - units/character/animations/hands/wpn_colt_idle 13:41:40.61 [Application] ----------------------------------------------------------------------- 13:41:40.61 [Application] Total Memory for animation - 380 kB
ゲームにアニメートされたキャラクタが多数含まれている場合は、アニメーション システムがエンジン内で大量の CPU を使用することがあります。この場合は、アニメーションの使用量を最適化するという作業が必要になります。(キャラクタが数個しかない場合は、アニメーションのパフォーマンスについて心配する必要はありません。)
ユニット内のオブジェクトを(Lua スクリプトから)動かす理由はさまざまですが、通常のゲームの場合、その一般的な理由はオブジェクトがアニメートされているからです。したがって、ここで費やされる時間の大半は、アニメーション システムに関係します。アニメートされたキャラクタ数が多いほど、費やされる時間は長くなります。
アニメーションを最適化する必要がある場合は、次の操作を試してください。
シンプルなブレンドとミキシングを使用します。結果を得るためにブレンドするアニメーション数を減らします。(ウェイト 0 でブレンドすると、アニメーション評価は自動的に最適化されるため、アニメーションを除去する必要がなくなります。ウェイトが 0 であることだけ確認してください。)
トランジション時間を短くすると、トランジション中に複数のアニメーションが再生されることがなくなります。
カットシーンでのみ使用されるボーンが多数ある場合は、ゲーム内のキャラクタにシンプルなリグを使用してください。
複雑なコンストレイント(エイム コンストレイントなど)は大きなコストとなることがあります。重要でないキャラクタには使用しないでください。
アニメーション コントローラ内でラグドールを使用すると、物理システムのランタイムに影響を与えることがあります。 多くのラグドールをシミュレートするには、コストがかかります。
気をつけなければならない非常に重要なことは、ラグドールが適切にスリープしない場合です。物理システムでは、落下するボディのように移動するオブジェクトのシミュレートにはコストがかかります。ただし、ボディが地面に着いて、これ以上動かなくなると、物理システムはそのボディを「スリープ状態」にできるようになるため、シミュレーションのコストは非常に小さくなります。
ラグドールが適切に設定されていない場合は、地面に着いた後も、わずかにジャークすることがあります(目で確認できない場合もあります)。その結果、ラグドールはスリープ状態にならず、ラグドール ユニットが破壊されるまで、シミュレーションのコストは大きくなります。特定のレベル内にこのようなラグドールが多数あると、物理的なシミュレーション時間が非常に長くなる可能性があります。
ラグドールが適切にスリープするかを確認するには、次のコンソール コマンドを使用して物理的なデバッグを有効にします。
physics debug on
「ウェイク状態の」動的なアクターは明るい黄色で表示されます。スリープ状態のアクターはくすんだ黄色で表示されます。
ラグドールをいくつか作成し、しばらくしたらスリープ状態になることを確認します。さまざまな種類の地面にラグドールをスポーンしてみましょう。平らな地面でラグドールが適切にスリープすることができたとしても、階段やスロープでは問題が生じることがあります。
スケルトンの LOD (詳細レベル)を設定すると、動きが見えない距離で小さなボーン(指など)のアニメーションが無効になるため、パフォーマンスが改善されます。ボーンのアニメーションが無効になっている場合、そのボーンはローカル空間内の現在の位置でフリーズします。
ボーンの LOD を設定するには、Skeleton Editor を使用します。
LOD ごとに、その LOD でアクティブなボーンを指定します。各 LOD には、前の LOD のボーンとその他のボーンが含まれています。(各 LOD は前の LOD を基に構築されます。)
スケルトンの LOD レベルは自動的に適用されません。特定のユニットに適したボーンの LOD レベルは、そのユニットの重要度、カメラからの距離などに応じてスクリプトが判別します。
ランタイムで使用されるスケルトンの LOD を設定するには、Lua スクリプト内に次のコマンドを配置します。
Unit.set_bones_lod(unit, lod_level)
スケルトンの LOD レベルは、他の LOD システム(メッシュの LOD システムなど)と関連しません。 メッシュ LOD を使用するかどうかに関係なく、スケルトン LOD を使用できます。メッシュ LOD の詳細については、「詳細レベル(LOD)」を参照してください。
スケルトンの LOD は、主に animation_blenders のコストを削減します(ただし、他のシステムのコストも削減できます)。このコストの内容を確認し、LOD を調べて(クイック テストでは、ゲーム内のすべてのユニットのルートを除くあらゆるものが無効になります)、プロジェクト内でスケルトン LOD を使用する価値があるかどうかを判別します。
アニメーションの合成とは、多数のユニットが含まれていて、その中の多くが同じアニメーションを再生している場合に(軍隊の行進など)、AnimationPlayer::update のコストを削減する最適化のことです。
通常、Stingray エンジンはゲーム内のユニットごとに独立したアニメーション エバリュエータを作成します。ゲーム内に実行アニメーションを使用しているユニットが 50 個存在する場合、各ユニットは独自のローカル時間(t=0.11、t=0.23、t=0.13)にアニメーションのポーズを個別に評価します。例外は、2 つのユニットがまったく同時に実行アニメーションを開始して、まったく同じ速度で再生する場合です。この場合、2 つのユニットは評価を共有できます。t=0.19 の時点で実行アニメーションの外観を一度特定するだけで、そのポーズを両方のユニットで再利用することができます。
アニメーションの合成による最適化を行うと、ポーズを同時に表示する必要性が軽減され、多くのユニットでアニメーション評価を共有できるようになります。たとえば、1 つのユニットが t=0.11 の時点で実行を評価し、別のユニットが t=0.13 の時点で実行を評価するとします。パフォーマンスを高めるには、t=0.12 の時点でアニメーションを一度評価して、それを両方のユニットで再利用します。各ユニットは予測と若干異なる時間にアニメーションを表示しますが、違いはほとんどわかりません。
アニメーションの合成を有効にするには、Lua スクリプトに次のコマンドを配置します。
Unit.set_animation_merge_options(u, "max_start_time", t1, "max_drift", t2, "clock_fidelity", f)
アニメーションの変動を防止するために、エンジンはアニメーション速度を若干変更することによって、時間値が大きく変動しないよう「欺く」ことがあります。このパラメータは、エンジン速度について許容される変動の大きさをコントロールします。
値が 1.0 の場合、エンジンはアニメータによって設定された速度に 100% 従う必要があり、変動は許容されません。
値が 0.9 の場合、エンジンはアニメーション速度に 90% 従う必要があります。他のアニメーションと適切に同期するために、アニメーション速度を最大 10% の範囲内で上げ下げすることができます。
上記のように、アニメーションの合成は、主に AnimationPlayer::update のコストに影響します。すべてのゲーム ユニットにさまざまなオプションを設定して、AnimationPlayer::update の時間に対する影響を確認し、プロジェクトにアニメーションの合成を使用する価値があるかどうかを判別してください。