アニメーションの最適化

メモリ

アニメーション メモリの使用量を最小に抑えるには、次の点を考慮します。

アニメーションのストリーミングはサポートされていません。

ゲームの実行中に、次のコンソール コマンドを使用できます。

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 スクリプトから)動かす理由はさまざまですが、通常のゲームの場合、その一般的な理由はオブジェクトがアニメートされているからです。したがって、ここで費やされる時間の大半は、アニメーション システムに関係します。アニメートされたキャラクタ数が多いほど、費やされる時間は長くなります。

アニメーションを最適化する必要がある場合は、次の操作を試してください。

ラグドールのパフォーマンス

アニメーション コントローラ内でラグドールを使用すると、物理システムのランタイムに影響を与えることがあります。 多くのラグドールをシミュレートするには、コストがかかります。

気をつけなければならない非常に重要なことは、ラグドールが適切にスリープしない場合です。物理システムでは、落下するボディのように移動するオブジェクトのシミュレートにはコストがかかります。ただし、ボディが地面に着いて、これ以上動かなくなると、物理システムはそのボディを「スリープ状態」にできるようになるため、シミュレーションのコストは非常に小さくなります。

ラグドールが適切に設定されていない場合は、地面に着いた後も、わずかにジャークすることがあります(目で確認できない場合もあります)。その結果、ラグドールはスリープ状態にならず、ラグドール ユニットが破壊されるまで、シミュレーションのコストは大きくなります。特定のレベル内にこのようなラグドールが多数あると、物理的なシミュレーション時間が非常に長くなる可能性があります。

ラグドールが適切にスリープするかを確認するには、次のコンソール コマンドを使用して物理的なデバッグを有効にします。

physics debug on

「ウェイク状態の」動的なアクターは明るい黄色で表示されます。スリープ状態のアクターはくすんだ黄色で表示されます。

ラグドールをいくつか作成し、しばらくしたらスリープ状態になることを確認します。さまざまな種類の地面にラグドールをスポーンしてみましょう。平らな地面でラグドールが適切にスリープすることができたとしても、階段やスロープでは問題が生じることがあります。

スケルトン LOD のパフォーマンス

スケルトンの 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)

max_start_time = 0
キャラクタが目的のアニメーションを既に再生している場合に、アニメーションの継続期間をコントロールします。たとえば、値に 0.2 を指定すると、既存の実行アニメーションを再利用して t=0.1 の時点で再生することはできますが、t=0.3 の時点で再生することはできません。適切な t で再生されているアニメーションがある場合に、このアニメーションにジャンプすると、時間の連続性が途切れることがあります。適切な t が存在しない場合、Stingray は別のアニメーション エバリュエータを作成します。
max_drift = 0
2 つ以上のユニットで同じアニメーションが共有されている場合、このパラメータはクロックに対して許容される変動の大きさをコントロールします(クロックが変動するのは、アニメーション速度が異なるためです)。この許容値を超えると、共有は停止し、各アニメーションが独自のエバリュエータを取得します。値に 0.2 s を指定すると、各ユニットの時間の変動が 200 ms 以内に収まっている限り、エバリュエータは引き続き共有されます。
clock_fidelity = 1.0

アニメーションの変動を防止するために、エンジンはアニメーション速度を若干変更することによって、時間値が大きく変動しないよう「欺く」ことがあります。このパラメータは、エンジン速度について許容される変動の大きさをコントロールします。

値が 1.0 の場合、エンジンはアニメータによって設定された速度に 100% 従う必要があり、変動は許容されません。

値が 0.9 の場合、エンジンはアニメーション速度に 90% 従う必要があります。他のアニメーションと適切に同期するために、アニメーション速度を最大 10% の範囲内で上げ下げすることができます。

上記のように、アニメーションの合成は、主に AnimationPlayer::update のコストに影響します。すべてのゲーム ユニットにさまざまなオプションを設定して、AnimationPlayer::update の時間に対する影響を確認し、プロジェクトにアニメーションの合成を使用する価値があるかどうかを判別してください。