Animation Budget Allocator は Unreal Engine で使用できるプラグインで、指定のスケルタルメッシュで実行されるアニメーション データに割り当てられる演算処理時間を制限します。Animation Budget Allocator を使用すると、処理バジェットを設定し、Budget Allocator でスケルタルメッシュ コンポーネントのアニメーションのティックを動的にスロットリング (調整) することで、多数のキャラクターをアニメートする際の負荷を削減することができます。アニメーション データに対して固定の CPU バジェットを設定することで、一度に多数のキャラクターをアニメートする際に、最小限のシステム オーバーヘッドで最大限のアニメーションの知覚品質を実現できます。

Animation Budget Allocator は固定のバジェットを決定します。このバジェットは、ゲーム スレッド で実行する作業のミリ秒 (ms) 単位でプラットフォームごとに調整できます。次に、Budget Allocator は、必要なすべてのアニメーションを更新できるかどうか、または最適化が必要かどうかを特定します。最適化が必要な場合、Budget Allocator は、ゲーム スレッド の固定のバジェット内に収まるように負荷を動的に調整するために、必要な更新の重要度を決定し、複数の基準に基づいてターゲットを特定します。
以下は、Budget Allocator がパフォーマンスの負荷を軽減するために最適化を行う対象となる領域です。
-
個々のスケルタルメッシュ コンポーネントのティックを停止し、存在する Leader Pose コンポーネントを優先する。
-
より低い頻度でアニメーションの更新を実行する。
-
更新の間を 補間 するかどうかを選択する。
前提条件
-
Animation Budget Allocator プラグイン を有効にします。メニュー バー で [Edit (編集)] > [Plugins (プラグイン)] の順に選択して [Animation (アニメーション)] セクションで [Animation Budget Allocator] を見つけるか、検索バーを使用して見つけます。このプラグインを有効にして、エディタを再起動します。このプラグインを有効にして、エディタを再起動します。
-
-
キャラクター ブループリントを含むスケルタルメッシュ キャラクター。
-
キャラクターで再生されるアニメーション。
Animation Budget Allocator を設定する
Animation Blueprint Allocator を活用するには、キャラクター ブループリントのメッシュ コンポーネントの [Component Class (コンポーネント クラス)] を設定し、SkeletalMeshComponentBudgeted クラスを使用する必要があります。
キャラクターのコンポーネント クラスを設定するには、キャラクターのブループリントで [Components (コンポーネント)] パネルに移動し、Mesh コンポーネントを選択して、[Details (詳細)] パネル を開きます。[Component Class] プロパティをドロップダウン メニューの SkeletalMeshComponentBudgeted オプションに設定します。

Alternativly, you can also add the following C++ code to your ACharacter
subclass constructor:
:Super(ObjectInitializer.SetDefaultSubobjectClass<USkeletalMeshComponentBudgeted>(ACharacter::MeshComponentName))
[Budgeting (バジェット)] セクションで、[Auto Calculate Significance (重要度を自動計算する)] をオンにし、[Auto Register with Budget Allocator (Budget Allocator に自動登録する)] がオンになっていることを確認します。

Enable Animation Budget ノードを作成し、キャラクターのブループリント イベント グラフの Event Begin Play ノードに接続し、Enabled プロパティをオンにします。

これで、コンテンツ ブラウザ からレベル ビューポート にアセットをドラッグするか、ブループリントを使用してキャラクターをスポーンすることで、キャラクター ブループリントをレベルに追加することができます。シミュレーションを開始すると、Budget Allocator がデフォルトで有効になります。ビューポートでシーンにレンダリングされるグラフを使用して、処理の負荷を確認することができます。
Budget Allocator が動作するためには、Enable Animation Blueprint Budget ノードとこの機能の両方が有効になっている必要があります。この機能はデフォルトで有効になっていますが、シミュレーション中に a.Budget.Enabled
コンソール コマンドを使用して切り替えることができます。バッククォート (`) キーを使用して、コンソール コマンドを入力したり、フィールドにコマンドを入力することができます。
Animation Budget Allocator のデバッグ オーバーレイを切り替えると、プロジェクトのシミュレーション中に a.Budget.Debug.Enabled
コンソール コマンドでリアルタイムにその動作を確認することができます。

Animation Budget Allocator を使用する
Animation Budget Allocator は、システムが生成できる最大限のアニメーション品質を維持しながら、アニメーション処理の総負荷をバジェット内に収めるための最適化を実行します。最も近くにある重要なメッシュを優先し、そのメッシュのアニメーションを可能な限り高いフレームレートで実行し、重要度の低いメッシュのフレームレートと品質を下げます。

Animation Budget Allocator のデバッグ グラフは、Y 軸にプロジェクトの処理負荷を、X 軸に経過時間を表示し、リアルタイムに更新されます。アニメーション システム全体に対するプロジェクトのバジェットが点線で表示され、グラフの右側に [Budget] というラベルが表示されます。
実線は、グラフの観測時間に沿った個々の時点におけるアニメーション システムの パフォーマンス を表します。
Animation Budget Allocator によって選択された最適化が考慮されている場合、パフォーマンスは、実行する必要のある作業量に応じて異なります。
統計オーバーレイ を有効にすると、Budget Allocator のプロセスに関する詳細情報を表示することができます。統計オーバーレイを有効にするには、ビューポート メニューで [Stat (統計)] > [Advanced (詳細)] に移動し、[AnimationBudgetAllocator] オプションを切り替えます。

これで、プロジェクト シミュレーションを開始すると、詳細情報が表示されるようになりました。

以下のリストで、Animation Budget Allocator の統計オーバーレイに表示される情報を参照できます。
統計情報 | 説明 |
---|---|
Initial Tick (初期ティック) | [Initial Tick] を使用すると、Budget Allocator が有効なときに、初期ティックの統計情報を確認できます。このカテゴリを使用すると、初期ティックの平均包括時間、最大包括時間、平均排他時間、最大排他時間をミリ秒 (ms) 単位で確認することができます。 |
Demand (需要) | Budget Allocator が処理している需要を確認することができます。Budget Allocator が処理しているオブジェクトの平均数、最大数、最小数を確認できます。 |
Num Registered Components (登録コンポーネント数) | モジュール キャラクター を構成する複数のスケルタルメッシュ コンポーネントを含む、Budget Allocator が処理中の登録済みのスケルタルメッシュ コンポーネントの数を確認できます。スケルタルメッシュ オブジェクトの平均数、最大数、最小数を確認できます。 |
Throttled (スロットル) | Budget Allocator が最適化している、スロットリングされたスケルタルメッシュ オブジェクトの数を確認できます。スケルタルメッシュ オブジェクトの平均数、最大数、最小数を確認できます。 |
Num Ticked Components (ティックしたコンポーネント数) | Budget Allocator がティックごとに最適化している、スケルタルメッシュ オブジェクトの数を確認できます。スケルタルメッシュ オブジェクトの平均数、最大数、最小数を確認できます。 |
Budget (バジェット) | Budget Allocator がティックごとに最適化できる、スケルタルメッシュ オブジェクトの数を確認できます。スケルタルメッシュ オブジェクトの平均数、最大数、最小数を確認できます。 |
Interpolated (補間) | Budget Allocator が、実際のアニメーション フレームのレンダリングではなく、補間を選択しているスケルタルメッシュ オブジェクトの数を確認できます。スケルタルメッシュ オブジェクトの平均数、最大数、最小数を確認できます。 |
SmoothedBudgetPressure | Budget Allocator のスムージング バジェットの圧力、つまり、アニメーション フレームではなく、補間を選択する場合の圧力の大きさを確認することができます。 |
Always Tick (常にティック) | Always Tick のステータス、およびフォールオフ時間を確認できます。Always Tick では、Budget Allocator の処理をバイパスすることで、メッシュが常にそのアニメーション データを更新することができます。 |
Average Work Units (ms) (平均作業単位 (ms)) | 各プロセス サイクルが完了するまでの時間をミリ秒 (ms) で確認できます。平均、最大、最小のクロック時間を確認することができます。 |
Animation Budget Allocator で最適化されている各スケルタルメッシュは、デバッグ情報を含む一意のオーバーレイでレンダリングされます。

数値はメッシュが更新されるレートを示します。値が「1」の場合は、すべてのフレームでメッシュが更新され、ティックすることを意味します。値が「5」の場合は、5 フレームごとにメッシュが更新され、ティックすることを意味します。
その他の表示情報は、アニメーション データがどのくらいの忠実度で処理されているかを示しています。Animation Budget Allocator がアニメーション データを処理する際のオプションは以下のとおりです。
- Hi (高詳細度) - スケルタルメッシュ コンポーネントで、より高負荷なロジックを実行している。
- Lo (低詳細度) - 高負荷なロジック (余分なキャラクターのパーツやさらに高負荷なタスクなど、距離があるときに省略可能なもの) が実行されていない。
- I (補間) - スケルタルメッシュがフレーム間を補間している。
モジュール キャラクター を使用する場合、モジュール キャラクターを構成する各スケルタルメッシュ コンポーネントのデバッグ情報を個別のグループで表示できます。

プラットフォームのスケーリング
複数のプラットフォーム向けに Unreal Engine プロジェクトを開発する場合、Animation Budget Allocator の設定をプラットフォームごとに制御することができます。
ほとんどの場合において、ターゲットとする特定のプラットフォームの スケーラビリティ設定 からシステムへの cvar
入力を設定することが推奨されます。
たとえば、次のように、[View Distance Quality (距離品質を表示)] 設定に基づいて、Animation Budget Allocator の目標バジェットを設定する「DefaultScalability.ini
」ファイルを追加できます。
[ViewDistanceQuality@0]
a.Budget.BudgetMs=1.0
[ViewDistanceQuality@1]
a.Budget.BudgetMs=1.5
[ViewDistanceQuality@2]
a.Budget.BudgetMs=2.0
[ViewDistanceQuality@3]
a.Budget.BudgetMs=2.5
これで、プラットフォーム固有のスケーラビリティ設定内でこれらの値をオーバーライドすることができます。
特定のプラットフォーム用のプロファイル作成の詳細については、「Android 向けのデバイス プロファイルとスケーラビリティのカスタマイズ」で Android デバイス用のプロファイルの作成例を参照してください。
Animation Budget Allocator の C++ API
Animation Budget Allocator の C++ ファイルは、次のパスにあるプロジェクトのインストール フォルダ「Engine
」に格納されています。
Engine\Plugins\Runtime\AnimationBudgetAllocator\Source\AnimationBudgetAllocator\Public\
以下は、「IAnimationBudgetAllocator.h
」ファイルの内容です。
// Copyright 1998-2019 Epic Games, Inc.All Rights Reserved.
#pragma once
class USkeletalMeshComponentBudgeted;
class UWorld;
struct FAnimationBudgetAllocatorParameters;
/**
* Dynamically manages skeletal mesh component tick rates to try to maintain a specified budget.
*/
class IAnimationBudgetAllocator
{
public:
/** Get the budgeter for the specified world */
static ANIMATIONBUDGETALLOCATOR_API IAnimationBudgetAllocator* Get(UWorld* InWorld);
/**
* Register a component with the budgeter system.If the component is already registered this function does nothing.
* Once this is called:
* - Default tick function will be disabled
* - URO will be disabled
* - Parallel anim tasks will be re-routed to the budgeter
*/
virtual void RegisterComponent(USkeletalMeshComponentBudgeted* InComponent) = 0;
/**
* Unregister a component from the budgeter system.If the component is not registered this function does nothing.
* Once this is called:
* - Default tick function will be re-enabled
* - URO will be re-enabled
* - Parallel anim tasks will be re-routed back to internal functions
*/
virtual void UnregisterComponent(USkeletalMeshComponentBudgeted* InComponent) = 0;
/**
* Update the prerequisites of this component.Should be called when prerequisites may have changed externally.
*/
virtual void UpdateComponentTickPrerequsites(USkeletalMeshComponentBudgeted* InComponent) = 0;
/**
* Set the significance and other flags for the specified component.
* This information is used to dynamically control the tick rate of the component.
*/
virtual void SetComponentSignificance(USkeletalMeshComponentBudgeted* Component, float Significance, bool bNeverSkip = false, bool bTickEvenIfNotRendered = false, bool bAllowReducedWork = true, bool bForceInterpolate = false) = 0;
/** 指定したコンポーネントがティックするかしないかを設定します。If the budgeter is disabled then this calls Component->SetComponentTickEnabled(bShouldTick). */
virtual void SetComponentTickEnabled(USkeletalMeshComponentBudgeted* Component, bool bShouldTick) = 0;
/** 指定したコンポーネントがティックするかしないかを設定したかを取得します。 */
virtual bool IsComponentTickEnabled(USkeletalMeshComponentBudgeted* Component) const = 0;
/** コンポーネントの作業を下げたことを知らせます。*/
virtual void SetIsRunningReducedWork(USkeletalMeshComponentBudgeted* Component, bool bInReducedWork) = 0;
/** ティック時間を設定します。 */
virtual void SetGameThreadLastTickTimeMs(int32 InManagerHandle, float InGameThreadLastTickTimeMs) = 0;
/** タスク完了時間を設定します */
virtual void SetGameThreadLastCompletionTimeMs(int32 InManagerHandle, float InGameThreadLastCompletionTimeMs) = 0;
/** フレームごとにシステムをティックします */
virtual void Update(float DeltaSeconds) = 0;
/** バジェットアロケータを有効にするかどうかを設定します */
virtual void SetEnabled(bool bInEnabled) = 0;
/** このバジェットアロケータが有効かどうかを取得します */
virtual bool GetEnabled() const = 0;
/** さまざまなパラメータを設定します */
virtual void SetParameters(const FAnimationBudgetAllocatorParameters& InParameters) = 0;
};
追加のコンソール コマンド
以下のリストで、Animation Budget Allocator を使用して作業する際に使用可能なコンソール コマンドと、その機能の説明を参照できます。
| コマンド | 値 | 説明 | | --- | --- | --- | |a.Budget.AlwaysTickFalloffAggression
| 範囲 [0.1, 0.9]、デフォルト = 0.8 | `常時ティック' コンポーネントが、負荷時にフォールオフされるレートを制御します。この値が大きいほど、割り当てられた時間のバジェットを超過したときに、より多くの常時ティック コンポーネントが削減されます。 |
a.Budget.BudgetFactorBeforeAggressiveReducedWork |
範囲 > 1、デフォルト = 2.0 | バジェットの圧力がこの量を超えると、削減された作業がより迅速に適用されます。 |
a.Budget.BudgetFactorBeforeReduceWork |
範囲 > 1、デフォルト = 1.5 | バジェットの圧力がこの量を超えるまで、作業量の削減を遅らせます。 |
a.Budget.BudgetFactorBeforeReducedWorkEpsilon |
範囲 > 0.0、デフォルト = 0.25 | バジェットの圧力が a.Budget.BudgetFactorBeforeReducedWork の値からこのコマンドの値を引いた値になるまで、作業量の増加を遅らせます。 |
a.Budget.BudgetMs |
値 > 0.1、デフォルト = 1.0 | スケルタルメッシュの作業の実行用に割り当てる時間 (ミリ秒) です。バジェットを超過した場合は、a.Budget.AlwaysTickFalloffAggression や a.Budget.InterpolationFalloffAggression など、他のさまざまなコンソール変数が有効になります。 |
a.Budget.BudgetPressureSmoothingSpeed |
範囲 > 0.0、デフォルト = 3.0 | 削減される作業のスロットリングに使用されるバジェット圧力値のスムージング量です。 |
a.Budget.Debug.Enabled |
値:0/1 | Animation Budget Allocator のデバッグ グラフがサポートされているビルドのビューポートでレンダリングするかどうかを制御します。 |
a.Budget.Debug.Force |
値:0/1 | すべてのメッシュのバジェット設定を特定の値にオーバーライド可能にします。 |
a.Budget.Debug.Force.Interp |
値:0/1 | a.Budget.Debug.Force が有効の場合、補間を切り替えます。「1」にすると補間が有効になり、「0」にすると補間が無効になります。 |
a.Budget.Debug.Force.Rate |
値: > 0 | a.Budget.Debug.Force が有効の場合、アニメーションの 1 ティックあたりのフレーム数をオーバーライドします。たとえば、「5」の場合はアニメーションは 5 フレームごとに更新されます。 |
a.Budget.BudgetMs |
値: > 0.0 | a.Budget.Debug.Force が有効の場合、アニメーション システムでバジェットを有効にするための閾値を下げます。たとえば、「0.1」の場合、バジェットを有効にするための閾値は大幅に下がります。 |
a.Budget.Debug.ShowAddresses |
値:0/1 | デバッグ レンダリングがコンポーネント データのアドレスも表示するかどうかを制御します。 |
a.Budget.Enabled |
値:0/1 | スケルタルメッシュのバッチ処理システムを有効にするかどうかを制御します。実行中のスケルタルメッシュがない場合に設定する必要があります。 |
a.Budget.GBudgetPressureBeforeEmergencyReducedWork |
範囲 > 0.0、デフォルト = 2.5 | 緊急時に作業を削減するバジェットの圧力を制御します (bAlwaysTick 以外のすべてのコンポーネントに適用されます)。 |
a.Budget.InitialEstimatedWorkUnitTime |
値 > 0.0、デフォルト = 0.08 | スケルタルメッシュ コンポーネントの実行にかかる予測平均時間をミリ秒単位で制御します。値はコンポーネントの最初のティックにのみ適用され、それ以降はティックがかかるリアルタイムのコンポーネントを使用します。 |
a.Budget.InterpolationFalloffAggression |
範囲 [0.1, 0.9]、デフォルト = 0.4 | 補間されたコンポーネントが負荷時にフォールオフするレートを制御します。この値が大きいほど、割り当てられた時間のバジェットを超過したときに、より多くの補間コンポーネントが削減されます。コンポーネントは、時間のバジェットを超えたときにのみ補間されます。 |
a.Budget.InterpolationMaxRate |
値 > 1、デフォルト = 6 | 補間時にティックが行われる頻度を制御します。 |
a.Budget.InterpolationTickMultiplier |
範囲 [0.1, 0.9]、デフォルト = 0.75 | 償却された補間ティックが「通常の」ティックと比較してかかる予測値を制御します。 |
a.Budget.MaxInterpolatedComponents |
範囲 >= 0、デフォルト = 16 | スロットリングを開始する前に補間するコンポーネントの最大数です。 |
a.Budget.MaxTickedOffsreen |
値 >= 1、デフォルト = 4 | 画面外でティックするコンポーネントの最大数です (最も重要度が高いのは最初のコンポーネントです)。 |
a.Budget.MaxTickRate |
値 >= 1、デフォルト = 10 | 許容されるティックの最大頻度です。この値が設定されていると、バジェットを超過する可能性がありますが、個々のメッシュの品質を妥当なレベルに保つことができます。 |
a.Budget.MinQuality |
値 [0.0, 1.0]、デフォルト = 0.0 | 許容される最小品質要求基準です。品質は NumComponentsTickingThisFrame / NumComponentsThatWeNeedToTick で簡単に決められます。この値が「0.0」以外の場合は、時間のバジェットを超過する可能性があります。 |
a.Budget.ReducedWorkThrottleMaxInFrames |
範囲 [1, 255]、デフォルト = 20 | システム ノイズや負荷ノイズが原因で削減される作業が頻繁に変更されることを防ぎます。バジェットの圧力が適用されているときに使用される最大値です。 |
a.Budget.ReducedWorkThrottleMaxPerFrame |
範囲 [1, 255]、デフォルト = 4 | ティックあたりの削減される作業との間で切り替えられるコンポーネントの最大数を制御します。 |
a.Budget.ReducedWorkThrottleMinInFrames |
範囲 [1, 255]、デフォルト = 2 | システム ノイズや負荷ノイズが原因で削減される作業が頻繁に変更されることを防ぎます。バジェットの圧力を超過したときに、使用される最小値 (例:積極的な削減を行ったとき) です。 |
a.Budget.StateChangeThrottleInFrames |
範囲 [1, 128]、デフォルト = 30 | システムや負荷ノイズによってスロット値が頻繁に変更されるのを防ぎます。 |
a.Budget.WorkUnitSmoothingSpeed |
値 > 0.1、デフォルト = 5.0 | 平均作業単位が測定量に収束する速度です。 |