Unity性能详解:动画模块性能

发表于2017-10-26
评论0 2.8k浏览

Animator.ApplyOnAnimatorMove:调用次数太多说明场景中角色数量太多了;

Animator.ProcessAnimationJob:关于AnimationClip的采样和读取;

WaitingForJobUnity5.X已经将其放入了子线程,等待子线程的处理;

角色的多少和AnimationClip的复杂程度影响耗时;

Animators.FireAnimationEventsAndBehaviour:动画事件;

Animators.DirtySceneObjects:优化时,勾选Optimiz Game Object选项;




打斗比较激烈时,开销比较高;

MOnAnimatorMoveDelegate.OnAnimatorMoveOnAnimatorMove的重写函数;

FK&Statemachine:正向动力学和状态机;(Animator Controller,状态机越负责,开销越大)

Write:重写入的过程,每一帧中回写每个骨骼节点的Transform的耗时;

MeshSkinning.Update:骨骼数量和三角面片的数量多时,开销高;

 

优化方案:

1:控制SkinnedMesh的骨骼数、动画曲线(复杂度和数量)等;

2:控制Animator.Update更新模式;

Always Animated / Cull Update Transform / Cull Complete

3:开启Optimize GameObject选项;(开启后,Write写回的耗时会大幅降低)



原因:触发了GameObjectInstantiateActive;

Animator.InitializeInstantiateActive GameObject时,GameObjectAnimator Controller上有很多状态机,Unity会重建上面的DataSetAvatarDataSetControllerDataSet),重建动画模块会有一定开销;


解决方案:

除了第一次使用InstantiateActive外,之后通过对Animator Controller组件进行ActiveDeactive,而GameObject不作处理,仍是Active状态,再把GameObject移出屏幕外;

UIAnimator不要使用InstantiateActive方式;


处理后的效果如下:



Unity性能详解系列:

CPU性能占用

渲染模块性能

物理模块性能

粒子系统性能

UI模块性能

加载模块性能


如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引