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())

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