Animator.ApplyOnAnimatorMove:调用次数太多说明场景中角色数量太多了;
Animator.ProcessAnimationJob:关于AnimationClip的采样和读取;
WaitingForJob:Unity5.X已经将其放入了子线程,等待子线程的处理;
角色的多少和AnimationClip的复杂程度影响耗时;
Animators.FireAnimationEventsAndBehaviour:动画事件;
Animators.DirtySceneObjects:优化时,勾选Optimiz Game Object选项;
打斗比较激烈时,开销比较高;
MOnAnimatorMoveDelegate.OnAnimatorMove:OnAnimatorMove的重写函数;
FK&Statemachine:正向动力学和状态机;(Animator Controller,状态机越负责,开销越大)
Write:重写入的过程,每一帧中回写每个骨骼节点的Transform的耗时;
MeshSkinning.Update:骨骼数量和三角面片的数量多时,开销高;
优化方案:
1:控制SkinnedMesh的骨骼数、动画曲线(复杂度和数量)等;
2:控制Animator.Update更新模式;
(Always Animated / Cull Update Transform / Cull Complete)
3:开启Optimize GameObject选项;(开启后,Write写回的耗时会大幅降低)
原因:触发了GameObject的Instantiate和Active;
Animator.Initialize:Instantiate或Active GameObject时,GameObject中Animator Controller上有很多状态机,Unity会重建上面的DataSet(AvatarDataSet和ControllerDataSet),重建动画模块会有一定开销;
解决方案:
除了第一次使用Instantiate或Active外,之后通过对Animator Controller组件进行Active、Deactive,而GameObject不作处理,仍是Active状态,再把GameObject移出屏幕外;
UI和Animator不要使用Instantiate或Active方式;
处理后的效果如下: