Unityパフォーマンスの最適化――アニメーションモジュール
4年前、Unityの各主要なモジュールのパフォーマンス最適化知識(初心者向け版)を1つずつ説明しました。近年、エンジン自体、ハードウェアデバイス、製作基準などのアップグレードに伴って、UWAは引き続き規則や方法を更新して、各開発者に提供しつつあります。「アップグレード版」のパフォーマンス最適化マニュアルとして、【Unityパフォーマンス最適化シリーズ】はより多くの開発者が利用できるように、シンプルでわかりやすい表現を心がけています。今回、アニメーションモジュールに関連する知識を共有します。
https://lab.uwa4d.com/lab/5b442633d7f10a201faf59b4
レポートにおいて、アニメーションに関連するメイン関数は次のものがあります。
Animatorに関連する関数は2つあります:1つはDirectorUpdateAnimationBeginで、もう1つはDirectorUpdateAnimationEndです。一般的に、これら2つの関数のスタックに注意を払い、スタック関数のコール回数と時間使用の割合から原因を特定する必要があります。消費された時間。パフォーマンスと最適化の対策に影響を与える一般的な要因は次のとおりです。
1)ActiveのAnimator数を制御する
キャラクター数の増加は全体時間の増加に繋がっています。キャラクターデータが増えるにつれて、各関数のCPU時間も直線的に増加します。
上図はあるプロジェクトの実機テストレポートです。あるフレームを選択してそのスタック情報を確認すると、ApplyOnAnimatorMoveのコール回数が168に達していることがわかります。これは、現在のシーンにおいて、Update状態にあるAnimatorは168個があることを意味します。一般的には、この値を30以内に保持することが勧められ、168という数値は非常に高いと言えます。
数値が高い理由として、通常、スクリーンの外の数多くのAnimatorは計算によるCPU時間を更新していることに由来します。キャラクターのAnimatorコンポーネントをキャッシュすることで、Active状態に維持することによるかもしれませんが、UIのAnimatorコンポーネントは多すぎることによって引き起こされた可能性もあります。UIのAnimatorが原因なら、簡単なアニメーションの場合、代わりにDotweenを使用して実装することをお勧めします。
2)「ApplyRootMotionをオンにする」Animatorの数を確認する
Animators.Updateのスタック分析を通じて、Animator.ApplyBuiltinRootMotionが28%の割合を占めることがわかります。これは、プロジェクトでApply Root Motionのモデルアニメーションがオンになっていることに関連しています。アニメーションがディスプレイスメントを必要としない場合は、このオプションをオンにする必要はありません。
3)Optimize Game Objectsというオプションをオンにする
このオプションが選択された状態では、Unityはアニメーションクリップの処理時にTransformのレベル情報を削除します。この設定は、Animators.Updateの時間コストを大きく軽減します。これにより、メインスレッドのアニメーション時間は大幅に削減され、貴重なメインスレッド時間を浮かせて、より複雑な計算ロジックに譲ります。
4)Animator.Initializeのトリガー頻度を制御する
Animator.Initializeは、Animatorコンポーネントを含むGameObjectがActiveまたはInstantiateされたときにトリガーされます。これはかなり時間がかかるので、戦闘中にAnimatorを含むGameObjectに対してDeactive / ActiveGameObject操作を頻繁に実行することはお勧めしません。下の図に示されています。
頻繁にインスタンス化されるキャラクターに対し、バッファプールの方法で処理することをお勧めします。キャラクターを非表示にする必要がある場合は、キャラクターのGameObjectを直接Deactiveするのではなく、DisableAnimatorコンポーネントを使用して、GameObjectをスクリーンの外に移動することにより、Animator.Initializeのコール頻度を軽減します。
5)AlwaysAnimateモードのAnimator Controller数が多すぎる
AlwaysAnimate状態では、キャラクターが画面外にあるとき、Updateコストが引き続き生成されます。このオプションをCullUpdateTransformsまたはCullCompletelyに変更することをお勧めします。CullUpdateTransformsは、アニメーションが変位を生成するAnimator Controllerに適しており、CullCompletelyは、アニメーションが変位を生成しないAnimatorControllerに適しています。
6)Animators.FireAnimationEventsAndBehaviours
これは、アニメーションイベントの具体的なコストです。主にプロジェクトのロジックコードのパフォーマンスコストです。この場合、開発チームがアニメーションイベントをさらにチェックすることをお勧めします。
7)グループアニメーションをレンダリングする時にGPU Skinning+GPU を使用するInstancing
UnityエンジンのネイティブなGPU Skinning操作をオフにすることをお勧めします。この操作により、余分なコストが発生し、メインスレッドまたはレンダリングスレッドで無効な待機が発生します。
同時に、同じ種類の多数のモンスターが必要な場合は、オープンソースライブラリでのGPU SkinningとGPU Instancingを使用してレンダリングすることをお勧めします。これにより、Animators.Updateの時間を短縮するだけでなく、バッチ処理の効果も実現できます。
関連するオープンソースライブラリのリンク:
https://lab.uwa4d.com/lab/5bc6f85504617c5805d4eb0a
https://lab.uwa4d.com/lab/5bc5511204617c5805d4e9cf
以上は、アニメーションモジュールを最適化するときの問題です。効率のために、一般的な方法ですが効果がある方法を提供します。「手作りのコインの代わりに印刷機を創造する」、パフォーマンスレポートを参照し、ctrl + fで「アニメーション」を検索して、レポートのアニメーションモジュールが正常でない場合、すぐに次の不合格な診断項目を確認できるようになります。
それに、ローカルアセットのテストのサービスでは、アニメーションアセットの関連設定の合理性をさらに包括的にチェックできるように、次の4つのテストルールも提供されております。
UWA公式サイト:https://jp.uwa4d.com
UWA公式ブログ:https://blog.jp.uwa4d.com
UWA公式Q&Aコミュニティ(中国語注意):https://answer.uwa4d.com