【Unity】SimpleAnimationとAnimationControllerと旧animationの速度比較
以前紹介したSimpleAnimationですが、使いやすさ的には合うケースは多そうですが、「パフォーマンス的には実際どうなのか?」と思ったので、少し確認して見ました。
- SimpleAnimation
- Is it fast?
- 早速比較・・・あれ?あまり変わらない?
- Simple Animation速い・・・?
- その差はシンプルさ故か
- ついでにSimpleAnimator
SimpleAnimation
Simple Animationはこちら。
レガシーのアニメーションのようなインターフェースでアニメーションを(アニメーター上で)再生するコンポーネントです。
内部的にはPlayable APIを採用しています。
Is it fast?
パフォーマンスの項目は、Wikiに記載がありました。
Home · Unity-Technologies/SimpleAnimation Wiki · GitHub
SimpleAnimation is, in most cases faster than using the AnimatorController. Otherwise, it is generally a bit slower than the Animation Component, except in cases where the AnimatorController would also be faster than the Animation Component (usually when using large clips).
まぁ速度はありそうです。
という事で、実際に確認して見ました。
早速比較・・・あれ?あまり変わらない?
比較方法はSimpleAnimationのTestにPerformanceTestsなるものがあるので、そちらを使用して確認してみました。
内容はAnimation Controller、SimpleAnimation、(Legacy)Animationのキャラクターを大量に出して、その負荷を比較するといったものです。
実行すると、みるみるうちにFPSが5を割ります。
で、いくつか比較して見ましたが、・・・思ったよりも違いがない・・・?
と思ってプロファイラを確認して見ましたが、どうやら処理負荷の大半は描画だったらしく、どちらかといえば描画の問題のよう。
描画コマンドと描画処理待ちに大半の時間を使用されています。
なので今度はモデルの描画を停止した状態でアニメーションを行ってみました。
アニメーションの状態をAlways Animate(画面外にあってもアニメーションを継続する)に設定し、カメラはアニメーションを行っているキャラクターを表示しないようにしています。
これをアプリケーションにビルドしてパフォーマンスの比較を行って見ました。(個人的には、Animatorは実際にビルドしたかどうかで結構パフォーマンスが変わる印象)
さて、これならどうでしょう?
Simple Animation速い・・・?
アニメーションを行ったキャラクターを1200体ほど表示して速度を見て見ます。
結果がこちら
- アニメーション無し:450FPS辺り
- SimpleAnimation:120辺り
- Animator:110辺り
- (Legacy)Animation:50辺り
実際にはAnimatorと比較すると、わずかにSimpleAnimationが早いです。
同様にLegacy Animationの遅さも目につきます。
その差はシンプルさ故か
AnimatorとAnimationの違い、実際に見てみるとSimpleAnimationはアニメーションの再生にAnimatorを使用していますが、実際に使用しているのはAnimationClipPlayableでした。
またWikiにも以下のように記載されています。
The additional cost of using the Animator comes from the different additional features offered by the Animator: Root Motion, script callbacks, compatibility with Humanoid and Timeline.
という事で、Animatorで提供している追加機能(Root RootMotoinやStateMachineBehabiour、もしかしたらHumanoidのIK関連も)を使用しないことによるコスト削減なのかもしれません。
Animationよりも高速な理由・・・それは単純にマルチスレッドでしょう。
動作をプロファイラのタイムラインで確認したところ、AnimationControllerやSimpleAnimationといったAnimatorベースで動作しているシステムはワーカースレッドでタスクを処理していますが、Animationはメインスレッドで全ての処理が行われていることが確認できます。
上がLegacyAnimation、下がAnimatorです。
ただスレッドが勝敗を決めるのならば、WebGLのようなスレッドが使用できないプラットフォームや、あまりスレッドが使えない(使えたとしても実際には小さいコアしか使えない)環境では、Animationも有効に動作するのかもしれません。
その辺りは未検証です。
また、Animator系は一瞬でFPSが下がったのに比較して、Animation系は数秒かけてFPSが下がっていったのも謎です。
その辺りはそのうち
ついでにSimpleAnimator
ついでに個人的に作成したSImple Animatorでも動かして見ました。
結果は僅かに早い130FPS前後。
本当に単純にアニメーションするだけの項目なら、生でPlayableを叩くのが一番良いかもしれません。