视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Cocos2d-x中异步动态加载图片或Plist文件
2020-11-09 08:32:15 责编:小采
文档


本章只分享一下异步加载的逻辑,如有不对的地方还望大家及时指出。 目前我代码中需要异步加载的资源一共有四类: 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加载即可使用里面的精灵。

下载本文
显示全文
专题