Unity Animator最適化に関して、あう可能性のある問題ーーAnimator編

キーワード

メモリリーク

アセット作成


一、メモリリーク

Q1:私たちのテストでは、Animator Controllerが掛けるアクションが比較的に多い場合、別の動きの少ないAnimator Controllerに切り替えても、タスクのアクション情報は解放しません。ヒーローをAssetBundleにパッケージし、カスタマイズされたRuntime Animator Controllerをロードして取り替えます。ヒーロー自有のRuntime Animator Controlleではすべてのアクションが掛けられます。Runtime Animator Controllerを取り替えてみた後に、前のRuntime Animator ControllerをDestroyしても、メモリが解放されていないようでした。

Animator Controllerを廃棄しても中に引用したAnimationClipアセットを解放しませんから、メモリが大幅に低下することは確かにありません。下記の方式で実験をやってみることをお勧めします。

1)Animator Controllerを廃棄した後、Unity Profilerを使用してすぐに実機でTake Sampleをし、Animation ClipのRef countは0であるかどうかを確認します。

2)そうでない場合は、さらにこれらのアセットのインデックスソースを確認する必要があります。0の場合は、UnloadUnusedAssetsまたはUnloadAssetによってメモリから削除できます。


二、アセット作成

Q1: Optimize Game Objectsは、以前バージョンのAnimationシステムに効果ありませんか?

無効です。Optimize Game Objects機能は、Unity4.3から導入された機能であり、Mecanimアニメーションシステムにのみ有効です。できれば、開発チームにMecanimをプロジェクトアニメーションシステムの解決案として使用することをお勧めします。


Q2: UWAパフォーマンスレポートでは、Optimize GameObjectを選択してMecanimアニメーションモジュールの実行性能を向上するとお勧めされましたが、この機能がキャラーのボーンを隠しますので、このボーンに掛けるポイントは照会できません。何かこの問題を解決する方法ありませんか?

そうです。Optimize GameObjectをオンにすると、デフォルトでアニメーションメッシュのすべてのボーンノードを非表示になさせます。しかし、「Extra Transform to Expose」を使ってプラグインを介して取りたいボーンノードを確認できます。これで、キャラクターのアニメーションモジュール性能を向上しながら、特定のキーノードを取得するための要件を満たすこともできます。


Q3: SkinnedMeshRenderer.BakeMeshという関数は通常いつコールされますか?Instantiateの後にコールされますか?

SkinnedMeshRenderer.BakeMeshの機能は次とおります。スキニングアニメーションのある時点の動きをスキンなしのメッシュにベイク処理します。これにより、アニメーションをカスタムサンプリング間隔でMeshシーケンスフレームのセットに変換できます。次に、アニメーションを再生するときに、最も近いサンプリングポイント(つまりメッシュ)を選択して値を与えれば良いです。これにより、ボーン更新とスキニング計算にかかる時間を節約できます。

この方法の利点は、計算時間をメモリに取り替えることです。シーンに1つの動画のあるモデルが大量に表示されると、効果は非常に明白です。欠点は、メモリの占用がモデル頂点数、動画合計時間、およびサンプリング間隔によって大幅に制限されることです。したがって、この方法は、頂点の数が少なく、アニメーションの合計時間が短いモデルにのみ適しています。同時に、ベイクには時間がかかるため、シーンがロードする時に完了する必要があります。

より典型的な適用シーンは、MOBAゲームの兵士です。


Q4: UWAが提供するレポートでは、Animatorが高すぎる問題が分かりました。そのうち、UIとキャラクターが別々に半分を占めます。以前は常にCullUpdateTransformsを選択していましたが、Unity公式ドキュメントを読むと、CullCompletelyが現在の状況により適用することがわかりました。CullCompletelyを選択した場合、隠れた危険性は何ですか?

RootMotionがオンにしている場合、CullCompletelyを使用することに注意する必要があります。たとえば、キャラクターにRootMotionによって作成されたパトロールアニメーションがある場合、キャラクターが画面から出た後、アニメーションは停止し、画面に戻リません。


Q5: アート制作中に40本のボーンを作成しましたが、アクションで使用されたのは30本だけでした。このやり方は、30本のボーンを作って使用したことと比べて、スキニング計算が大幅に増加しますか?(Animationは圧縮処理をしました)

理論的には増加があります。ボーン計算はすべてのボーン階段のMatrixを乗算して得るものですから、理論的にはオーバーヘッドが発生します。Optimize GameObjectオブジェクトを使用することをお勧めします。不要なCPUコストを一部減らすことができます。


UWA公式サイト:https://jp.uwa4d.com

UWA公式ブログ:https://blog.jp.uwa4d.com

UWA公式Q&Aコミュニティ(中国語注意)https://answer.uwa4d.com