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,用这个纹理贴出来。
转载于:https://www.cnblogs.com/SeanLin/archive/2012/03/15/2398190.html
CCTextureCache的多线程加载原理和使用相关推荐
- 内嵌WEB服务器加载原理
内嵌WEB服务器加载原理 理解里面的tomcat是如何启动的 Startup.bat Server.start() 1,概述 我们在使用springboot项目的时候并没有使用外部的tomcat,那么 ...
- SpringSecurity过滤器链加载原理
SpringSecurity过滤器链加载原理 通过前面十五个过滤器功能的介绍,对于SpringSecurity简单入门中的疑惑是不是在心中已经有了答案了呀? 但新的问题来了!我们并没有在web.xml ...
- datax底层原理_Datax 插件加载原理
Datax 插件加载原理 插件类型 Datax有好几种类型的插件,每个插件都有不同的作用. reader, 读插件.Reader就是属于这种类型的 writer, 写插件.Writer就是属于这种类型 ...
- 浅析Android字体加载原理
浅析Android字体加载原理 前言 之前在处理系统字体问题的时候,可借鉴的资料很少,遇到了很多坑,不得不了解Android字体加载原理,现抽空写一篇总结,来加深自己对这块的理解. 内容 概述 And ...
- PyTorch训练中Dataset多线程加载数据,比Dataloader里设置多个workers还要快
PyTorch训练中Dataset多线程加载数据,而不是在DataLoader 背景与需求 现在做深度学习的越来越多人都有用PyTorch,他容易上手,而且API相对TF友好的不要太多.今天就给大家带 ...
- 【PyTorch训练中Dataset多线程加载数据,比Dataloader里设置多个workers还要快】
文章目录 一.引言 二.背景与需求 三.方法的实现 四.代码与数据测试 五.测试结果 5.1.Max elapse 5.2.Multi Load Max elapse 5.3.Min elapse 5 ...
- Unity导表工具Luban插件的数据加载原理与优化
文章目录 1. 配置Luban并测试 2. Luban 数据加载原理 3. 根据工程进行懒加载优化 3.1 增加公共接口与接口实现方法 3.2 外部提供获取数据的方法 3.3 对Luban中的导表模板 ...
- 【Docker镜像文件加载原理生产中重新制作并提交镜像文件案例演示】
一.知识回顾 之前的内容都帮你整理好了,在这里哟! [0.Docker相关目录文章整理,可自行查看,包含多节内容] [1.Docker详细安装部署&阿里镜像地址配置] [2.Docker架构& ...
- 老调重弹:JDBC系列之驱动加载原理全面解析)
前言 最近在研究Mybatis框架,由于该框架基于JDBC,想要很好地理解和学习Mybatis,必须要对JDBC有较深入的了解.所以便把JDBC 这个东东翻出来,好好总结一番,作为自己的笔记,也是给读 ...
最新文章
- C语言嵌入式系统编程修炼
- Flutter AnimatedAlign 使用解析
- 霍尼韦尔dcs系统组态手册_DCS和PLC有“血缘关系”吗?
- python调用c++动态库_Python应用:调用C/C++动态链接库的方法详解
- MySQL 5.6和MySQL 5.7的区别
- LayaAir 屏幕适配-分辨率、对齐模式
- mysql外键英文_MySQL开发中的外键(foreign key)与参照完整性(Referential integrity) [中英文转载]...
- JAVA中jspinner设置选中内容_java – 如何在JSpinner中获取所选项的值?
- 推荐系统实践--第七章:推荐系统实例 第八章:评分预测问题
- 2022 年顶级网络安全专家最爱用的10大工具
- 【滤波器】7. 带通滤波器
- rda分析怎么做_PCA、PCoA、NMDS 、RDA和CCA等排序分析方法
- 层次分析法(AHP)模型的应用案例
- angular pipe
- Android Calander Event
- loss scale的理解
- Github 之删除文件或者文件夹(不影响本地文件,只删除远端的指定文件或者文件夹) 操作
- 如何让U盘同时兼容Windows和Mac OS X系统
- 一个基于pycuda的矩阵乘法实现,它使用CUDA核心来
- 【Unity3D】关于 InputManager 以及改键功能的制作
热门文章
- 2021年香河一中高考成绩查询,2021年廊坊高考状元名单公布,廊坊文理科状元是谁多少分...
- 计算机语言中tc是什么,新人必须了解的几个TC常用语和脚本基础知识!
- 基于javaweb SSM邮件收发信息系统设计和实现以及文档
- Java--Mybatis万字长文经典面试题王者笔记《收藏版》
- android分辨率px跟dp,Android屏幕适配 px,dp,dpi及density的关系与深入理解
- java下文_java实现文件下载的两种方式
- Spring Boot 分布式会话
- Spring Boot 页面国际化
- Redis Spring集成
- redis timeout设置多少合适_热水器怎么调温度?一般热水器温度设置多少度比较合适?...