背景
项目中, 使用了quick 3.3, 由于Spine各个功能相当强大, 所以使用了Spine作为骨骼动画, 但是Spine并非cocos官方支持,因此在一些问题上支持性不是那么好,其中如何异步加载Spine就是一个问题。
比如游戏中经常遇到这么一个问题:在主战斗场景中, 需要加载大量的图片、声音、Spine动画等, 如果我们等用到的时候再去加载,由于文件I/O是比较耗时的, 有可能就会在游戏过程中造成卡顿的现象,在低端配置手机中体现尤为明显,这或大或小造成游戏体验不佳。
对于这个问题呢, 一种比较常用的解决方案:在进入主战斗之前, 先预加载战斗中大量耗时的资源(并不一定要是所有资源),并且缓存起来,等到真到需要用到的时候,直接去读取缓存中的数据。
比如很多游戏看到的Loading条, 就是用的这种方案。
难点
1、异步加载
cocos本身已经支持了一些资源的异步加载回调, 使用多线程做的,每加载完一个资源,都可以有异步回调作相应的处理(比如显示加载进度)。但是 对于一些cocos官方不支持的资源,比如Spine等,就需要自己实现异步加载回调。
自己实现我知道有两种方法。
一种就是和cocos官方的一样, 也用多线程做, 这个没什么好说的。
一种就是叫做”同步异步化“,开启一个每帧都update函数,在update()里加载一次资源,用同步的方式实现异步加载资源,这种方法叫做:”同步异步化”。
在Lua中还有另一种方法可以实现,就是用Lua的协程,更加的方便。
我自己使用的是使用的update这种方法。
function LoadingLayer:update(ts) - --- 每帧加载一次资源
local pngNum = table.nums(ResMng._pngList)
local plistNum = table.nums(ResMng._plistList)
local soundNum = table.nums(ResMng._soundList)
local spineNum = table.nums(ResMng._spineList)
local curLoadNum = ResMng._curLoadNum
-- 加载资源顺序
-- 1、加载PNG
if 0 <= curLoadNum and curLoadNum < pngNum then
ResMng.