アニメーション ブループリント を使用して Unreal Engine でアニメーション システムを開発すると、複数のアニメーション最適化技術を活用してプロジェクトのパフォーマンスを向上させることができます。
このドキュメントでは、Unreal Engine でアニメーション システムを最適化するためのいくつかのベストプラクティス技法について説明します。
概要
プロジェクトのアニメーション システムのパフォーマンス、つまりフレームがどれだけ効率よく評価されるかは、アニメーション システムの各 ティック を処理するために ゲーム スレッド と ワーカー スレッド で必要となる時間の量に依存します。
アニメーションがアニメーション ブループリントに追加されると、そのブループリントでアニメーションが評価されてランタイム時にキャラクターで再生されます。アニメーション ブレンド、IK 評価、物理シミュレーションなどの追加のプロセスについては、それぞれを評価する際にプロジェクトのパフォーマンス バジェットが消費されます。一部のプロセスはシンプルで、評価のためにパフォーマンス バジェットをあまり必要としませんが、より高度な演算を実行して優れた外観のアニメーションが得られるものの、より多くのパフォーマンス バジェットが必要になるプロセスもあります。すべてのアニメーション システムの機能には、その機能に関連して生じるパフォーマンス上の負荷があります。
全般的に、アニメーション ブループリントの操作において最もパフォーマンス負荷が大きいのは イベント グラフ のロジックです。AnimGraph のロジックは Fast Path といったシステムを使って最適化できる一方で、イベント グラフのロジックについては、最高のパフォーマンスを得るために可能な限り削減することが推奨されます。イベント グラフは各ティックで評価され、それぞれのプロセスは ゲーム スレッド で順次発生します。
次の図は、アニメーションの単一フレームを概念的に分解したものです。アニメーションの各フレームにはいくつかのティックが含まれており、イベント グラフはそれぞれのティックごとに評価されます。通常、イベント グラフの評価は各ティックで実行される最大の処理です。イベント グラフの評価は順次的であるため、それぞれのティックの評価には完了までにより多くの時間がかかります。

このプロセスは、イベント グラフのロジックを、利用可能な ワーカー スレッド 上で同時に評価することができる スレッド セーフな関数 に移行することで最適化できます。
次の図では、それぞれのティックの完了までにかかる時間の大幅な削減を示しています。すべてのイベント グラフの処理をスレッド セーフな関数に移行すると、処理を同時に実行できるようになるため、各ティックの評価に必要な時間が大幅に削減されて、アニメーション システムのパフォーマンスが向上します。

マルチスレッド アニメーションの更新を使用する
アニメーション ブループリントのイベント グラフは常に ゲーム スレッド 上で実行されます。イベント グラフ内のロックを最適化してマルチスレッドのメリットを得るために、スレッド セーフな関数 を代わりに使ってロジックを構築できます。
スレッド セーフであることを確保するために、プロジェクト内のブループリントとコンポーネントから派生したデータ (変数など) へのすべての参照は、アニメーション ブループリントにプッシュするのではなく、アニメーション ブループリントによって呼び出される必要があります。
Blueprint Thread Safe Update Animation
Blueprint Thread Safe Update Animation オーバーライド関数を使用すると、アニメーション ブループリントのロジックをスレッド セーフな方法で評価することができます。Blueprint Thread Safe Update Animation 関数は、[My Blueprint (マイ ブループリント)] パネルの [Function (関数)] セクションの横にある [Override (オーバーライド)] ドロップダウン メニューから選択することでアニメーション ブループリントに追加できます。

スレッド セーフな関数
スレッド セーフな関数とは、イベント グラフ内で実行される標準的な他の処理の実行に加えて、アニメーション システムで使用可能な変数とプロパティを設定するためのロジックの実行に使用できる ブループリント関数 です。
アニメーション ブループリント内にスレッド セーフな関数を作成するには、まず [My Blueprint (マイ ブループリント)] パネルの [追加 (+)] ボタンを使って新しい関数を作成します。新しい関数の [Details (詳細)] パネルを開き、Thread Safe プロパティを有効にします。

これで、Thread Safe プロパティが有効な関数を Blueprint Thread Safe Update Animation オーバーライド関数に追加して、各ティックでワーカー スレッドが使用可能になった際に同時に評価されるようにできます。

プロパティ アクセス
スレッド セーフな関数で非スレッド セーフなブループリントやコンポーネントに直接アクセスすることはできません。非スレッド セーフなブループリントとそのプロパティに安全にアクセスするために、プロパティ アクセス (Property Access) 機能を使ってそれらのデータを読み取ったり、関数を呼び出したりすることができます。プロパティ アクセスは、スレッド セーフな関数のグラフ内、または AnimGraph ノードのピンのプロパティ内でスタンドアローンのノードして使用できます。


Property Access ノード | Property Access ピン
Property Access ノードを作成するには、スレッド セーフな関数のグラフ内を右クリックしてコンテキスト メニューから [Property Access (プロパティ アクセス)] オプションを選択します。

Property Access ノードは、アニメーション ブループリントに関連する他のブループリントとゲーム オブジェクトに含まれる変数やコンポーネント、データの参照に使用できます。Property Access データ呼び出しのソースを定義するには、Bind (バインド) ドロップダウン メニューをクリックして、参照するコンポーネントまたはプロパティを選択します。プロパティまたはコンポーネントを選択することで、オブジェクトまたはデータを直接参照したり、プロパティまたはコンポーネントのネスティングされたオプション間を移動して、そのコンポーネントまたはプロパティに直接アクセスしたりできます。

これで、結合されたプロパティ アクセスの参照を使って、スレッド セーフなブループリント関数内で追加のプロパティまたは変数を設定できるようになります。

スレッド セーフな関数 と プロパティ アクセス データ の使用に関する詳細については、「アニメーション ブループリントでのグラフ作成」ドキュメントを参照してください。
スレッド セーフな関数とプロパティ アクセスを使ってアニメーション変数を取得するワークフロー例については、「アニメーション変数を取得する方法」ドキュメントを参照してください。
スレッド セーフな関数を使用するために Unreal Engine プロジェクトを最適化するワークフロー例については、「Lyra アニメーションを UE5 ゲームに適応する方法について」ブログ記事を参照してください。
Animation Fast Path
Animation Fast Path は、AnimGraph の更新内で変数のアクセスを最適化することができます。Animation Fast Path を使用すると、エンジンはブループリントのコードを実行するのではなく (これは、Blueprint Virtual Machine への呼び出しを必要とする)、内部でパラメータをコピーすることができます。現在、コンパイラは以下の構造体最適化することができます。
-
メンバー変数
-
否定 Boolean メンバー変数
-
ネスティングされた構造体のメンバー
Animation Fath Path を活用するには、Animation ブループリントの AnimGraph 内で、ブループリントのロジックが実行されていないことを確認します。
以下のブループリント例では、AnimGraph がいくつかの浮動小数点値を読み取っています。これらの値は、複数の Blend Space アセットと 1 つの Blend ノードを制御するために使用されおり、その結果は Output Pose に入力されます。右上に稲妻アイコンが表示されている各ノードは、ロジックが実行されていないため、Fast Path を利用しています。

グラフにいずれかの形式の計算が追加されると、関連付けられているノードは Fast Path を使用しなくなります。次の例では、float 変数に単純な乗算関数が追加されたため、Blend Space ノードが Fast Path が使用できなくなっています。このグラフがコンパイルされると、この変更を示す稲妻アイコンが削除されます。

Fast Path メソッド
以下は、Animation ブループリントで Fast Path 変数へのアクセスを実装するために使用できるメソッドです。
メンバー変数に直接アクセスする
Fast Path を使用すると、変数の値に直接アクセスして読み取り、出力ポーズを決定することができます。

ネスティングされた構造体のメンバーにアクセスする
ローテータ変数などのネスティングされた構造体を分割して、Fast Path を利用しながら、そのコンポーネントに直接アクセスすることができます。グラフ内の変数を右クリックし、表示されるコンテキスト メニューから [Split Struct Pin (構造体ピンを分割)] を選択するか、Break ノードを使用することで、構造体を直接分割することができます。これで、そのコンポーネントに直接アクセスできるようになります。

Break Transform など、一部の Break Struct ノードでは Fast Path を使用しません。これは、単にデータをコピーするのではなく、内部で変換を行うためです。
Warn About Blueprint Usage (ブループリントの使用方法について警告する)
アニメーション ブループリントで Fast Path が使用されていることを確認するには、Warn About Blueprint Usage プロパティを有効にします。Warn About Blueprint Usage を有効にすると、AnimGraph から Blueprint Virtual Machine が呼び出されたときに、コンパイラが [Compiler Results] パネルに警告を表示します。
Warn About Blueprint Usage を有効にするには、Animation ブループリント の [Class Settings (クラス設定)] の [Optimization] でこのオプションを有効にします。

Warn About Blueprint Usage プロパティを有効にして AnimGraph でブループリント ロジックを実行すると、Fast Path を使用してアクセス可能な変数にアクセスしていない場合に、[Compiler Results] パネルに警告メッセージが表示されます。警告メッセージのリンクをクリックすると、警告の原因となっている箇所に焦点を絞ってグラフが表示されます。これにより、最適化が必要な箇所を追跡することができ、最適化できる可能性のあるノード変数アクセスを特定することができます。

アニメーション最適化ツール
Unreal Engine には、アニメーション システムを分析して、最適化できる可能性のある領域を見つけることのできる一連のデバッグ ツールが備わっています。
Rewind Debugger
Rewind Debugger では、プレイ イン エディタ (PIE) シミュレーションのセグメントを記録して、アニメーション システムをリアルタイムで分析することができます。トレース を使用することで、バグや最適化可能なパフォーマンスの問題をターゲットとして、アニメーション システムのプロパティの評価を監視できます。

Rewind Debugger の設定と使用の詳細については、次のドキュメントを参照してください。
一般的なヒント
プロジェクトのアニメーション システムのパフォーマンスの検討を始めたら、最適化プロセスの次のガイドラインを考慮することができます。各プロジェクトには独自の最適化要件があり、プロジェクトの規模とスコープに基づいて、より踏み込んだ変更が必要な場合がありますが、以下のガイドラインでは、ほとんどのプロジェクトにメリットがもたらされる一般的なアプローチを紹介します。
-
Parallel Updates の条件が満たされていることを確認します。
- UAnimInstance::NeedsImmediateUpdate 構造体では、ゲーム スレッド で実行されるアニメーションの更新フェーズを避けるために満たす必要のあるすべての条件を確認することができます。キャラクターの動きに ルート モーション が必要な場合は、並列更新を行うことはできません。キャラクターの動きはマルチスレッド処理ではないためです。
-
可能な場合は、Update Rate Optimizations (URO) を使用します。
-
URO は、アニメーションのティックの頻度が過剰にならないようにします。これをどのように適用するかはプロジェクトのニーズに応じて異なります。ただし、ほとんどのキャラクターにおいて、適切な距離で 15Hz 以下で実行する更新レートをターゲットにして、補間を無効にすることをお勧めします。
-
URO を有効にするには、スケルタルメッシュ コンポーネントの [Details] パネルで [Optimization] セクションに移動し、Enable Update Rate Optimizations プロパティを選択します。その後、
AnimUpdateRateTick()
構造体を使用して、ブループリントのティック レートを設定し、確認することができます。
-

- 任意で、スケルタルメッシュ コンポーネントの [Details] パネルで Display Debug Update Rate Optimizations プロパティを有効にすることで、シミュレーション中にプロジェクトに適用される URO のレートのオンスクリーン デバッグ表示を使用することもできます。

アニメーション ブループリントの評価のティック レートを制御するには、URO ではなく Animation Budget Allocator プラグイン を使用することを推奨します。
-
キャラクターがその 物理アセット にアクセスする必要がない場合は、Component Use Fixed Skel Bounds を有効にします。
- スケルタルメッシュ コンポーネントの [Details] パネルで、Component Use Fixed Skel Bounds プロパティを有効にします。
-
これにより、物理アセットの使用が省略され、代わりにスケルタルメッシュで定義された固定の境界が常に使用されます。
-
これにより、フレームごとのカリング用のバウンディング ボリュームの再計算も省略されるため、パフォーマンスが向上します。
その他の考慮事項
Animation Insights を使用してプロジェクトのプロファイリングを行うと、ワーカー スレッドがそのプロセスを完了した後に、メイン スレッドでスケルタルメッシュに対して FParallelAnimationCompletionTask が実行されている場合があります。並列更新の条件が満たされた場合、プロファイルで見られるメイン スレッド作業のほとんどはこのプロセスで占められます。通常、このプロセスは、セットアップに応じて、次のような複数のプロセスで構成されます。
-
物理オブジェクトの更新など、プロジェクトのコンポーネントの動きを計算します。
- 可能な限り、実際に物理を必要としないものについては、物理の更新を回避します。これは、FParallelAnimationCompletionTask の最も大きな削減につながります。
-
アニメーションの通知を発行します。
-
Blueprint Virtual Machine の呼び出しを避けるため、すべての通知はブループリント ベースではない必要があります。
-
アニメートしたオブジェクトのライフタイムに影響を与える可能性があるため、通知は ゲーム スレッド で実行する必要があります。
-
-
URO が有効な場合、アニメーションを補間します。
-
マテリアル カーブまたはモーフ ターゲットのカーブを使用している場合は、カーブをブレンドします。