Spine动画是我们在2D游戏开发中比较常用的一个插件,在Spine的动画加载方面,经常会遇到加载耗时和内存分配过大的问题,这是因为在Spine加载时会将Spine文件的所有动画一次性加载,但是通常存在浪费的现象(比如角色展示界面、某些关卡中只需要特定的动画)。

那么如何实现按需加载动画,从而获得比较优秀的运行速度和较低的内存占用呢?

本课程对于Spine动画加载的流程进行了修改,使用了懒加载的方式实现Spine动画的按需加载,有效地降低Spine动画的堆内存分配。内容包括思路分析,代码详解,优化前后的性能对比。让我们先从测试结果来直观感受此方案带来的优化效果:

#1

测试结果

以下是两个测试案例,对比了优化前和优化后的堆内存驻留情况,

示例1

拥有一千个简单动作的Spine官方小人在场景中,每一秒钟切换一个新的动作(由于一秒钟一个,所以到3000帧仅使用了很少量的动作)。

打开网易新闻 查看更多图片
打开网易新闻 查看更多图片

  • 优化前后的内存驻留对比:6.25MB → 582.42KB。

打开网易新闻 查看更多图片

  • 优化前的内存分配:18.06MB;优化后加载阶段内存分配:3.77MB;优化后切换动画时的轻微内存分配:26.11KB。

打开网易新闻 查看更多图片

示例2

十几个拥有几个简单动作的人形角色,在几秒钟内随机切换动作(这种方式则在3000帧时已经使用过了80%的动作)。

  • 按需加载后,随着不同动画的播放,堆内存驻留是慢慢升高的,而不像优化前一次性就达到峰值。

打开网易新闻 查看更多图片

#2

适合项目

从结果来看,本方案更适合骨骼文件中动画数量较多,有几百个甚至上千个的情况。而当单个角色的骨骼文件如果不具有太多数量的动画(<10个),并且一个场景需要使用单个角色的所有动画,这种情况的优化效果则会不太明显,反而多个角色同时切换一个新的“未被加载”的动画时,会引起一些懒加载产生的卡顿。

因此本文的优化方法需要按照项目需求使用,也可以自行对加载产生的耗时做适当优化(比如字符串申请内存,字符串拼接等产生的耗时)。

PS:本文采用Spine 4.0版本进行的测试,其他的Spine版本可以参考文章代码进行适配。

#3

用户反馈

打开网易新闻 查看更多图片
打开网易新闻 查看更多图片