Cocos2D-x , CCTextureCache的多线程加载原理和使用方法

来源:未知 责任编辑:责任编辑 发表时间:2013-12-01 14:14 点击:
在查阅资料学习的时候,看到一个texture的异步加载,觉得挺有用的所以将具体的原理和使用方法分享出来,后面大家根据浏览器的特性可以做相应修改移植。 p>void CCTextureCache::addImageAsync(const char *path, CCObject *target, SEL_CallFuncO selector)

p>{

p>CCAssert(path != NULL, “TextureCache: fileimage MUST not be NULL”);

p>CCTexture2D *texture = NULL;

p>// 优化

p>std::string pathKey = path;

p>CCFileUtils::ccRemoveHDSuffixFromFile(pathKey);

p>pathKey = CCFileUtils::fullPathFromRelativePath(pathKey.c_str());

p>texture = m_pTextures->objectForKey(pathKey); //根据pathkey查看是否纹理已经加载过,如果已经有了,则不重复加载

p>std::string fullpath = pathKey;

p>if (texture != NULL)

p>{

p>if (target && selector)

p>{

p>(target->*selector)(texture);

p>}

p>return;

p>}

p>if (target)

p>{

p>target->retain();

p>}

p>// lazy init

p>static bool firstRun = true;

p>if (firstRun)

p>{

p>s_pAsyncStructQueue = new queue<asyncstruct>();

p>s_pImageQueue = new queue<imageinfo>();

p>pthread_mutex_init(&s_asyncStructQueueMutex, NULL);

p>sem_init(&s_sem, 0, 0);

p>pthread_mutex_init(&s_ImageInfoMutex, NULL);

p>pthread_create(&s_loadingThread, NULL, loadImage, NULL); //创建新的线程,用于后台加载图片

p>//创建调度队列,用来根据已加载的图片进行纹理转换

p>CCScheduler::sharedScheduler()->scheduleSelector(schedule_selector(CCTextureCache::addImageAsyncCallBack), this, 0, false);

p>need_quit = false;

p>firstRun = false;

p>}

p>// 生成异步结构

p>AsyncStruct *data = new AsyncStruct();

p>data->filename = fullpath.c_str();

p>data->target = target;

p>data->selector = selector;

p>// 添加到队列异步结构

p>pthread_mutex_lock(&s_asyncStructQueueMutex);

p>s_pAsyncStructQueue->push(data); //将需要加载的图片放入队列中

p>pthread_mutex_unlock(&s_asyncStructQueueMutex);

p>sem_post(&s_sem);

p>}

p> 

p>从上述代码分析可以看出其过程:

p>1.创建线程,用于后台加载

p>2. 将对于需要加载的图片放入队列中

p>       3. callback函数设定,用于将加载完成的图片转为纹理,等待使用其调用是由CCTimer::update调用的。

p>       4. addImageAsyncCallBack函数在处理完纹理转换,还会调用addImageAsync传入的SEL_CallFuncO selector,实现用户加载图片纹理之后的具体处理。

p>使用例子:

p>CCTextureCache::sharedTextureCache()->addImageAsync(“Images/blocks.png”, this, callfuncO_selector(TextureCacheTest::loadingCallBack));

p>loadingCallBack函数就是使用异步加载完之后的用户可以自处理结果,比如初始化一个sprite,用这个纹理贴出来。

    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码:点击我更换图片
    最新评论 更多>>

    推荐热点

    • cocos2d-x学习笔记(19)--label 、label atlas
    • cocos2d-x学习笔记(23)--地图的使用3--CCTMXLayer
    • Cocos2d-x学习(一):HelloWorld
    • cocos2dx在xcode下开发,编译到android上(2)
    • cocos2d 设置屏幕默认方向
    • cocos2d-x学习笔记(22)--地图的使用2(TMX) --Z-Order、AnchorPoi
    • Cocos2d-x 2.0 之 Actions “三板斧” 之一
    • cocos2d-x学习笔记(18)--游戏打包(windows平台)
    • cocos2d-x学习笔记(16)--spritesheet(精灵表单)
    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1