CCTextureCache的多线程加载原理和使用

做引擎的时候,遇到一个texture的异步加载,这里将具体的原理和使用方法贴出来,后面根据浏览器的特性做修改移植。 

voidCCTextureCache::addImageAsync(constchar *path, CCObject *target, SEL_CallFuncO selector)

{

CCAssert(path != NULL, "TextureCache: fileimage MUST not be NULL");


CCTexture2D *texture = NULL;


// optimization


std::string pathKey = path;

CCFileUtils::ccRemoveHDSuffixFromFile(pathKey);


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

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


std::string fullpath = pathKey;

if (texture != NULL)

{

if (target && selector)

{

(target->*selector)(texture);

}

return;

}

       if (target)

{

target->retain();

}


// lazy init

static bool firstRun = true;

if (firstRun)

{      

        s_pAsyncStructQueue = new queue<AsyncStruct*>();

    s_pImageQueue = new queue<ImageInfo*>();


pthread_mutex_init(&s_asyncStructQueueMutex, NULL);

sem_init(&s_sem, 0, 0);

pthread_mutex_init(&s_ImageInfoMutex, NULL);

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

 

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

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

need_quit = false;

firstRun = false;

}


// generate async struct

AsyncStruct *data = new AsyncStruct();

data->filename = fullpath.c_str();

data->target = target;

data->selector = selector;


// add async struct into queue

pthread_mutex_lock(&s_asyncStructQueueMutex);

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

pthread_mutex_unlock(&s_asyncStructQueueMutex);


sem_post(&s_sem);

}

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

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

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

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

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

使用例子:

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

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

关键词:cocos2d-html5,cocos2d-x,游戏引擎

转载于:https://www.cnblogs.com/SeanLin/archive/2012/03/15/2398190.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/576567.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ElasticSearch fuzzy模糊查询(英文检索)

fuzzy实现模糊查询 value:查询的关键字 boost:查询的权值&#xff0c;默认值是1.0 min_similarity:设置匹配的最小相似度&#xff0c;默认值为0.5, 对于字符串,取值为0-1(包括0和1);对于数值&#xff0c;取值可能大于1;对于日期型取值为1d,1m等&#xff0c;1d就代表1天 prefix…

机器学习笔记(十八)——HMM的参数估计

一、HMM中的第三个基本问题 参数估计问题&#xff1a;给定一个观察序列OO1O2…OT&#xff0c;如何调节模型μ(A,B,π)的参数&#xff0c;使得P(O|μ)最大化&#xff1a; argmaxμP(Otraining|μ)arg \max_{\mu} P(O_{training}|\mu)模型的参数是指构成μ的πi,aij,bj(k)。本文…

[Pyramid 杂记]Static Routes,静态路由是用来干什么的?

官方文档上介绍说Static Routes(即添加路由时指定static参数为True,config.add_route(page, /page/{action}, staticTrue)),在匹配Request Url时不会被用来匹配,它只用于生成URL. 这哥就很奇怪,只用于生成URL,而不会被匹配,就是说生成的URL不会被匹配到了嘛(有点拗口 …),那要这…

ElasticSearch highlight搜索结果高亮显示(英文检索)

高亮显示搜索结果&#xff08;使用highlight&#xff09; #高亮搜索结果 GET /lib3/user/_search {"query":{"match":{"interests": "changge" } }, "highlight": { "fields": {"interests":{}}}}{&qu…

最优化学习笔记(十二)——基本共轭方向算法(续)

目标函数为n维二次型函数时,共轭方向法能够在n步迭代之后得到极小点。接下来会发现&#xff0c;共轭方向法的中间迭代步骤具有一种很有意义的性质。选定x(0)作为迭代初始点&#xff0c; d(0)为初始搜索方向&#xff0c; 有&#xff1a; x(1)x(0)−(g(0)Td(0)d(0)TQd(0))d(0)\…

C++ 入门笔记1

一.关于注释 注释总是以 /* 开始并以 */ 结束。这意味着&#xff0c;一个注释对不能出现在另一个注释对中。由注释对嵌套导致的编译器错误信息容易使人迷惑。 当注释掉程序的一大部分时&#xff0c;似乎最简单的办法就是在要临时忽略的区域前后放一个注释对。问题是如果那段代码…

基本查询(Query查询中文)

查询语句&#xff1a; GET /lib4/user/_search {"query": {"term": {"interests":"唱歌"}} }#terms:查询某个字段里含有多个关键词的文档 GET /lib4/user/_search {"query":{"terms":{"interests": …

C#实现POST提交方式

网页自动登录和提交POST信息的核心就是分析网页的源代码&#xff08;HTML&#xff09;&#xff0c;在C#中&#xff0c;可以用来提取网页HTML的组件比较多&#xff0c;常用的用WebBrowser、WebClient、HttpWebRequest这三个。 以下就分别用这三种方法来实现&#xff1a; 1、WebB…

最优化学习笔记(十三)——基本共轭方向算法(扩张子空间定理)

由上节我们得出的一个引理&#xff1a; 引理 在共轭方向算法中&#xff0c; 对于所有的k,0≤k≤n−1,0≤i≤k都有 : g(k1)Td(i)0\boldsymbol{g}^{(k+1)T}\boldsymbol{d}^{(i)}=0由上可知&#xff1a;g(k1)正交于由向量d(0),d(1),…,d(k)张成的子空间中的任意向量。该引理可用…

term和match查询总结(中文检索)

es中的查询请求有两种方式&#xff0c;一种是简易版的查询&#xff0c;另外一种是使用JSON完整的请求体&#xff0c;叫做结构化查询&#xff08;DSL&#xff09;。 由于DSL查询更为直观也更为简易&#xff0c;所以大都使用这种方式。 DSL查询是POST过去一个json&#xff0c;由于…

机器学习笔记(十九)——最大熵原理和模型定义

一、最大熵原理 最大熵原理是概率模型学习的一个准则。最大熵原理认为&#xff0c;在学习概率模型时&#xff0c;在所有可能的概率分布中&#xff0c;熵最大的模型是最好的模型。通常用约束条件来确定概率模型的集合&#xff0c;所以&#xff0c;最大熵模型也可以表述为在满足约…

EasyCode.Net代码生成器使用心得

前段时间购买了一个EasyCode的正式使用许可 看他的界面设计的不错 就用他生成了一个项目(目地是想把以前我自己的一个程序的界面给更换下 人家有专业的UI设计我自己设计出来的肯定没有人家专业UI设计师弄出来的好看) &#xff0c;项目生成完了 发现还不能直接更换界面他的是sq…

ElasticSearch(中文检索)source总结

包含不包含这里不多讲了。 GET /lib4/user/_search {"query": {"match_all": {}},"_source": {"includes": ["name" ,"address"],"excludes": ["age" , "birthday" ]} }直接看看…

2012 依赖注入框架

以下内容来自维基百科的控制反转词条 控制反转&#xff08;英语&#xff1a;Inversion of control&#xff0c;缩写为IoC&#xff09;&#xff0c;也叫做依赖注入&#xff08;Dependency Injection&#xff0c;简称DI&#xff09;&#xff0c;是面向对象编程中的一种设计原则&a…

机器学习笔记(二十)——求解最大熵模型

一、问题的引出 最大熵模型的学习过程就是求解最大熵模型的过程。最大熵模型的学习可以形式化为约束最优化问题。 对于给定的训练数据集T{(x1,y1),(x2,y2),…,(xn,yn)}及特征函数fi(x,y)&#xff0c;i1,2,…,n,最大熵模型的学习等价于约束最优化问题&#xff1a; maxP∈C…

ElasticSearch前缀匹配查询和范围查询(中文检索)

GET /lib4/user/_search {"query": {"match_phrase_prefix": {"name": {"query": "赵"}}} } GET /lib4/user/_search {"query": {"prefix": {"name": "赵"}} }范围查询 GET /lib4…

系统管理员必须知道的PHP安全实践

系统管理员必须知道的PHP安全实践 PHP是一种开源服务器端脚本语言&#xff0c;应用很广泛。Apache web服务器提供了这种便利&#xff1a;通过HTTP或HTTPS协议&#xff0c; 访问文件和内容。配置不当的服务器端脚本语言会带来各种各样的问题。所以&#xff0c;使用PHP时要小心。…

ElasticSearch模糊查询(中文检索)

# "*" 表示匹配任意字符 GET /lib4/user/_search {"query": {"wildcard": {"name": "赵*"}} }# "?" 表示匹配任意一个字符 GET /lib4/user/_search {"query": {"wildcard": {"name&quo…

最优化学习笔记(十四)——共轭梯度法

共轭梯度法不需要预先给定Q共轭方向&#xff0c;而是随着迭代的进行不断产生Q共轭方向。在每次的迭代中&#xff0c;利用上一个搜索方向和目标函数在当前迭代点的梯度向量 之间的线性组合构造一个新的方向&#xff0c;使其与前边已经产生的搜索方向组成Q共轭方向。对于一个n维二…

ElasticSearch filter查询

学习查询之前&#xff0c;我还是老规矩&#xff0c;先准备数据 #Filter查询 #filter是不计算相关性的&#xff0c;同时可以cache.因此&#xff0c;filter速度要快于query. POST /lib5/items/_bulk {"index":{"_id": 1}} {"price": 40,"ite…