目前我代码中需要异步加载的资源一共有四类: 1.png,单个png的情况比较少 2.plist和png一起的打包资源 3.plist和pvr.ccz一起的打包资源 4.cocosstudio导出的.exportjson后缀的动画文件 再重复一遍加载机制:所有的资源是按序加载的,不可同时加载多个文件。
目前我代码中需要异步加载的资源一共有四类:
1.png,单个png的情况比较少
2.plist和png一起的打包资源
3.plist和pvr.ccz一起的打包资源
4.cocosstudio导出的.exportjson后缀的动画文件
再重复一遍加载机制:所有的资源是按序加载的,不可同时加载多个文件。执行异步加载的处理肯定是写在void update(float f)中,做到按帧加载。
1.png的异步加载
1
2
director::getinstance()->gettexturecache()->addimageasync(reloadimages[curreloadimgnum],
cc_callback_1(loadingscene::imageasynccallback, this));
2.plist和png一起的打包资源
废话不多,直接上方法,没有加载plist的api,我们使用如1的方法加载png,然后在回调函数中加载plist。
1
2
director::getinstance()->gettexturecache()->addimageasync(reloadplists[curreloadplistnum]+png,
cc_callback_1(loadingscene::plistimageasynccallback, this));
注意回调函数的参数,这是plist异步加载的关键,形参是png纹理。
1
2
3
4
5
6
void loadingscene::plistimageasynccallback(cocos2d::texture2d* texture)
{
spriteframecache::getinstance()->addspriteframeswithfile(reloadplists[curreloadplistnum].append(plist), texture);
curreloadplistnum++;
loading = true;
}
3.plist和pvr.ccz一起的打包资源
类似2的方法。
1
2
3
4
5
6
7
8
director::getinstance()->gettexturecache()->addimageasync(reloadpvrplists[curreloadpvrplistnum] + pvr.ccz,
cc_callback_1(loadingscene::pvrplistimageasynccallback, this));
void loadingscene::pvrplistimageasynccallback(cocos2d::texture2d* texture)
{
spriteframecache::getinstance()->addspriteframeswithfile(reloadpvrplists[curreloadpvrplistnum].append(plist), texture);
curreloadpvrplistnum++;
loading = true;
}
4.cocos studio导出的.exportjson后缀的动画文件
1
2
3
4
5
6
7
armaturedatamanager::getinstance()->addarmaturefileinfoasync(reloadexportjsons[curreloadexportjsonnum],
this, schedule_selector(loadingscene::jsonasynccallback));
void loadingscene::jsonasynccallback(float f)
{
curreloadexportjsonnum++;
loading = true;
}
四种加载方法已经介绍完了,只要在update中做好按序加载就可以了。
如何优化内存,加载尽量少的资源?
我的这个场景叫loadingscene,这是一个中转场景,既是切换两个场景之间的过渡场景,用来释放上一个场景的资源和预加载下一个场景资源。
在这个场景中,我们可以释放掉cache中的所有文件,然后根据下个场景的内容来加载所需的文件。 这就需要我们做好配置工作,比如保卫萝卜,下一关只有两种塔,我们只加载这两种塔的动画即可,而不需要所有塔全部加载。
还有一个小技巧关于异步加载exportjson的文件。这个异步加载,既可以加载动画缓存,还可以把跟它一起的plist和png一起加载到缓存中,所有如果想加载plist,也可以把它们到成静止的动画,然后使用exportjson加载即可使用里面的精灵。
来源网址:http://www.cocoachina.com/bbs/read.php?tid=219154