Spine动画是我们在2D游戏开发中比较常用的一个插件,在Spine的动画加载方面,经常会遇到加载耗时和内存分配过大的问题,这是因为在Spine加载时会将Spine文件的所有动画一次性加载,但是通常存在浪费的现象(比如角色展示界面、某些关卡中只需要特定的动画)。
那么如何实现按需加载动画,从而获得比较优秀的运行速度和较低的内存占用呢?
本课程对于Spine动画加载的流程进行了修改,使用了懒加载的方式实现Spine动画的按需加载,有效地降低Spine动画的堆内存分配。内容包括思路分析,代码详解,优化前后的性能对比。让我们先从测试结果来直观感受此方案带来的优化效果:
#1
测试结果
以下是两个测试案例,对比了优化前和优化后的堆内存驻留情况,
示例1
拥有一千个简单动作的Spine官方小人在场景中,每一秒钟切换一个新的动作(由于一秒钟一个,所以到3000帧仅使用了很少量的动作)。
![](https://static.ws.126.net/163/frontend/images/2022/empty.png)
![](https://static.ws.126.net/163/frontend/images/2022/empty.png)
优化前后的内存驻留对比:6.25MB → 582.42KB。
![](https://static.ws.126.net/163/frontend/images/2022/empty.png)
优化前的内存分配:18.06MB;优化后加载阶段内存分配:3.77MB;优化后切换动画时的轻微内存分配:26.11KB。
![](https://static.ws.126.net/163/frontend/images/2022/empty.png)
示例2
十几个拥有几个简单动作的人形角色,在几秒钟内随机切换动作(这种方式则在3000帧时已经使用过了80%的动作)。
按需加载后,随着不同动画的播放,堆内存驻留是慢慢升高的,而不像优化前一次性就达到峰值。
![](https://static.ws.126.net/163/frontend/images/2022/empty.png)
#2
适合项目
从结果来看,本方案更适合骨骼文件中动画数量较多,有几百个甚至上千个的情况。而当单个角色的骨骼文件如果不具有太多数量的动画(<10个),并且一个场景需要使用单个角色的所有动画,这种情况的优化效果则会不太明显,反而多个角色同时切换一个新的“未被加载”的动画时,会引起一些懒加载产生的卡顿。
因此本文的优化方法需要按照项目需求使用,也可以自行对加载产生的耗时做适当优化(比如字符串申请内存,字符串拼接等产生的耗时)。
PS:本文采用Spine 4.0版本进行的测试,其他的Spine版本可以参考文章代码进行适配。
#3
用户反馈
![](https://static.ws.126.net/163/frontend/images/2022/empty.png)
![](https://static.ws.126.net/163/frontend/images/2022/empty.png)