(csb文件、图片资源)预加载简略版讲解

环境:cocos3.10 c++ (win7 + vs2013)

预加载资源一般放入缓存中,有异步和同步加载两种方式(一般针对plist大文件)
这些资料网上有各种博客讲解,大家一搜就能搜到。

可查看下这个帖子:http://www.cocoachina.com/bbs/read.php?tid=219154

加载csb:
CSLoader.h 头文件中
static cocos2d::Node* createNode(const std::string& filename);//普通加载csb
static cocos2d::Node* createNode(const std::string& filename, const ccNodeLoadCallback& callback);
static cocos2d::Node* createNode(const Data& data);//预加载csb
static cocos2d::Node* createNode(const Data& data, const ccNodeLoadCallback &callback);
可使用createNode(const Data& data)函数来达到预加载csb的作用。

使用步骤:
const Data data = FileUtils::getInstance()->getDataFromFile(“res/MainScene.csb”);
auto _node = CSLoader::createNode(data);
this->addChild(_node);

缺点:需要一个全局变量来保存data数据。没图片预加载那么方便。但是自己控制内存也不错。

函数简介:
进入createNode函数后,会指向:Node * CSLoader::createNode(const Data& data, const ccNodeLoadCallback &callback)
在它里面主要有4部分组成
1、auto csparsebinary = GetCSParseBinary(data.getBytes()); //data数据转移到csparsebinary 中
2、SpriteFrameCache::getInstance()->addSpriteFramesWithFile(textures->Get(i)->c_str());//加载资源
3、 node = loader->nodeWithFlatBuffers(csparsebinary->nodeTree(), callback);//csparsebinary数据转化成node数据
4、loader->reconstructNestNode(node);//重建node

如有错误之处,望指正!

最后感谢各位对cocos的支持!

非常感谢,一直在找csb文件的预加载!
但有个问题想请教下:
const Data data = FileUtils::getInstance()->getDataFromFile(“res/MainScene.csb”);
这一步获取了csb文件的数据之后,
auto _node = CSLoader::createNode(data);
这一步中的第2部分:
SpriteFrameCache::getInstance()->addSpriteFramesWithFile(textures->Get(i)->c_str());//加载资源
这里加载资源的,那如何用在预加载做进度条呢?难道直接调用createNode但是不add,在回调中做进度?求解惑

static cocos2d::Node* createNode(const Data& data, const ccNodeLoadCallback &callback);

如果预加载csb做进度条,那么就用这个函数,和异步加载plist有点类似。

感谢,C++中有这个方法,但lua中没有,尝试genbindings,FileUtils::getInstance()->getDataFromFile会报错,解决错误后, createNode(const Data& data, const ccNodeLoadCallback &callback)会断点,是否不支持lua?

if (argc == 2)
{
cocos2d::Data *arg0;
ok &= luaval_to_objectcocos2d::Data(tolua_S, 2, “cc.Data”, &arg0, “cc.CSLoader:createNode”);
if (!ok) { break; }
std::function<void(cocos2d::Ref )> arg1;
do {
// Lambda binding for lua is not supported.
assert(false);
} while (0)
;
if (!ok) { break; }
cocos2d::Node
ret = cocos2d::CSLoader::createNode(arg0, arg1);
object_to_luavalcocos2d::Node(tolua_S, “cc.Node”, (cocos2d::Node
)ret);
return 1;
}

有个问题想请教下版主,lua调用createNode带回调函数的接口,回调函数不起作用,lua好像不支持,怎么处理,求解决
do {
// Lambda binding for lua is not supported.
assert(false);
} while (0)
;

三楼、四楼,让我考虑一下怎么解决,然后完善这个教程。
感谢提出问题!

版主是否已经有解决方法?求指导啊,我们项目现在想用预加载csb文件做进度条,现在加载回调没办法用。有没有什么好的方法?

抱歉,这两天有点私事,所以耽误了一下。

你先看看能否使用普通加载csb的方法回调。(使用这个函数也可以,csb文件相对于图片要小的多,加载csb文件速度基本可以忽略,先暂时用这个函数,等我两天。。。囧)

lua可以预加载csb动画了么,最近有几个动画加载的时候比较卡顿,想看看有没有好的解决方案