Spine在游戏中的使用

Spine在我们游戏项目中的应用
第一次写博客,实属不知道从何下手,就简单介绍一下目前我们游戏(一款已上线的女性向游戏)中Spine的应用吧

一、在游戏中显示Spine
我们是将Spine在UI和场景中的显示分开处理的
1.Spine在UI中的显示
在生成的Spine预制物添加SkeletonGraphic组件,该类提供了如播放动画,播放速度,朝向等接口;
添加SpineActionEventHandler组件,该类主要是对动画播放的事件监听,处理。
2.Spine在场景中的显示
在生成的Spine预制物添加SkeletonAnimation组件,该类提供了如播放动画,播放速度,朝向等接口;
添加SpineActionEventHandler组件,该类提供了监听动画事件帧的处理;
添加刚体Rigidbody和碰撞体BoxCollider

二、遇到的问题
在Spine动画中如果检测到当前帧与下一帧的三角网格发生了变化或者下一帧的子网格material引用发生了变化,会强制更新Material,会导致修改Meshrenderer.material失效,猜测是因为外部修改了MeshRenderer.materials会生成新的material实例,导致SkeletonRenderer管理的Material与实际网格所引用的Material不一样。
关于这个问题,我们的解决方案是在OnWillRenderObject重新赋值sharematerials,每次更改material之后,都会在下一次渲染之前将修改的值赋值给sharematerials。
官方的方案是用MaterialPropertyBlock来修改材质数据,可参考https://blog.csdn.net/qq_14838361/article/details/78655881,一般情况下推荐使用mpb进行设置,效率更高,不会产生新的材质实例,并且相同材质时使用属性相同的mpb可以进行合批

三、性能问题
主要的性能消耗在Skeleton.UpdateWorldTransform()这个函数里面,该函数更新Spine的全部骨架数据,因此,骨架越多,性能消耗越大
我们的优化方案是,尽量减少骨架,降低该函数在Update中的调用频率 ,例如if(Time.frameCount % 2 != 0 ) return;
官方的建议是
1 if(Time.frameCount % 2 != 0 ) return 减少Update帧率
2 降低骨架复杂度
3 每帧只更新一部分骨架
4 仅让少数骨架实现动画效果,减少需要更新的骨架
5 尽量不注册UpdateWorld事件(会再调用一次Skeleton.UpdateWorldTransform())

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章