Spine动画缓存优化

背景

Spine是一种骨骼动画工具,我们游戏中的人物、光效等动画资源,基本上都是用它做的。

Spine官方主页:http://zh.esotericsoftware.com/

Spine做出来的动画最终会导出三个文件,分别为:.atlas,.json,.png。

atlas文件和png文件记录合图前的所有被切割的图片信息,而json文件记录的是骨骼配置和动画信息,也就是Spine动画最关键的数据。

为了能让导出的文件在不同的引擎中运行,需要针对不同的引擎写对应的播放代码。这些代码在https://github.com/EsotericSoftware/spine-runtimes中可以找到。

我们的游戏引擎是cocos2dx,里面已经集成了一个Spine动画的播放代码。不一定是最新的,有必要时可以到上面的gitbug中去下载最新的。

问题

背景已经讲完,看看在游戏中使用Spine时遇到什么问题。

问题1、加载多个Spine动画时会比较卡。

原因:加载Spine动画时,需要加载上面提到的三个文件,并且读取json文件里面的动画信息,转换成内存对象,整个过程是阻塞的。当加载多个Spine文件后,造成阻塞的时间比较长,所以就会有卡顿出现了。

问题2、同样的Spine动画加载多个,内存上升明显。

原因:Spine动画数据没有重用,同一个动画加载多个到场景中时,会加载多次,数据也成倍增加。既浪费内存又增加加载卡顿的时间。

针对第一个问题,有一种解决方案,就是避免同一个时间加载过多的Spine动画,可以采用每一段时间加载一个,这样可以分摊加载压力,不至于瞬间卡死程序。这种方法可以缓解,但没有根除。

但不能解决第二个问题。所以得想一种能解决这两种问题的方案。

解决方案

针对问题1,可以采用异步加载的方式,也就是加载过程不要阻塞主线程(渲染线程),开一个线程来加载,加载完成后把数据给主线程,让其渲染。这样可以避免卡顿。

针对问题2,需要一个池子保存加载过的动画数据,当遇到重复的Spine动画时,直接把上次加载的数据返回即可,这样既避免了内存暴涨,又避免了多余的加载过程。

实现

新建SpineCache类,专门用来开线程加载数据和缓存数据。具体实现可以直接到VS里面去看了。纯代码的东西还真不知道怎么描述。。。

注意事项

1、记得手动清除SpineCache里面缓存的数据,我们目前是在切换场景时调用clearAllCache接口。当然特殊时候也可以手动移除指定的缓存。

2、Spine运行时代码的更新,这个比较蛋疼,如果更新了Spine 的运行时代码,需要把修改的SpineCache代码功能加进去。

posted @ 2015-08-24 15:55  玉腰  阅读(6026)  评论(0编辑  收藏  举报