UE4.22からの新機能でAnimation Budget Allocatorというものが追加されました。
これは決められたバジェット(予算)内でアニメーション処理に使えるCPUリソースを自動的に調整、制限してくれるという機能です。公式のドキュメントは以下から。
ただし、このドキュメントには重要な導入の仕方の部分が一切記載されておらず、このままでは利用することができません。今回は実際に試してみて動作させることに成功したのでここで解説してみます。
導入方法
まずはドキュメントにもある通り、プラグインをオンにしておく必要があります。
次にコンソールコマンド、"a.Budget.Enabled 1" と入力することでシステムが有効になります。が、これだけでは実行できません。ブループリント上で、"Enable Animation Budget"を呼び出しておく必要があります。
更にこれらのシステムはキャラクターのアニメーションが初期化される前に実行される必要があり、Begin Playなどが走る前に実行しておかねばなりません。レベルブループリントのBegin Playでは間に合わないことがあるので、ここでは"Game Instance"の"Event Init"で初期化を行いました。
これでやっとシステム上でAnimation Budget Allocatorが有効化されます。ただし、これだけではまだ利用できません。
コンポーネントの置換
システムは利用できるようになりましたが、実際に利用するためにはキャラクタークラス上で既存の"Skeletal Mesh Component"を"Skeletal Mesh Component Budgeted"に置き換える必要があります。ただし、これはブループリントのみでは不可能なので、C++を使う必要があります。
AMyCharacter::AMyCharacter(const class FObjectInitializer& OI) : Super(OI.SetDefaultSubobjectClass<USkeletalMeshComponentBudgeted>(ACharacter::MeshComponentName)) { // 以下何かを処理 }
上記のようにコンストラクター上で、FObjectInitializerを使って既存のSkeletal MeshをSkeletal Mesh Budgetedに差し替えることができます。これで始めて本当に利用可能になります。
BP上でこのクラスを派生し、差し替えされていることを確認します。
計測する
実際に動作しているかを計測してみました。公式ドキュメントには"a.Budget.Debug.Enabled 1"とコマンドを入れるとデバッグ表示がでると書かれてますが、コードを読む限りではそのような実装はなかったので、実際は利用不可能です。※少なくとも4.22.2の時点では
代わりに"stat AnimationBudgetAllocator"というstatコマンドは利用可能なのでこちらを利用して実際に動作しているかを確認します。
今現在割り当てられているバジェットが現在どのくらいあるのかがわかります。
コンソールコマンドで"a.Budget.BudgetMs"を使うことで、バジェットの時間を指定することができます。デフォルトは"1"となっており、バジェットは1秒内で処理可能なように調整されています。このバジェットを越えると、アニメーションは様々な間引きが行われるようになり、カクカクと動いたり、補間アニメーションが働くようになります。
この間引きの調整は他のコマンドを使うことで可能なので、詳しくは公式ドキュメント上に記載されているものを実際に試してみてください。
以下は実際に動作している時の動画。
4.22のAnimation Badget Allocatorの使い方ようやくわかってきた…大量のキャラクターのアニメーションを上手くバジェット(予算内)に収めるために自動的にアニメーションのレート変更や補間が働いて、Game Threadがかなり軽くなる。バジェット設定を詰めればもっと軽くできそう。#UE4Study pic.twitter.com/Doadu5LqP0
— alwei (@aizen76) May 29, 2019