做引擎的时候,遇到一个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

CCTextureCache的多线程加载原理和使用相关推荐

  1. 内嵌WEB服务器加载原理

    内嵌WEB服务器加载原理 理解里面的tomcat是如何启动的 Startup.bat Server.start() 1,概述 我们在使用springboot项目的时候并没有使用外部的tomcat,那么 ...

  2. SpringSecurity过滤器链加载原理

    SpringSecurity过滤器链加载原理 通过前面十五个过滤器功能的介绍,对于SpringSecurity简单入门中的疑惑是不是在心中已经有了答案了呀? 但新的问题来了!我们并没有在web.xml ...

  3. datax底层原理_Datax 插件加载原理

    Datax 插件加载原理 插件类型 Datax有好几种类型的插件,每个插件都有不同的作用. reader, 读插件.Reader就是属于这种类型的 writer, 写插件.Writer就是属于这种类型 ...

  4. 浅析Android字体加载原理

    浅析Android字体加载原理 前言 之前在处理系统字体问题的时候,可借鉴的资料很少,遇到了很多坑,不得不了解Android字体加载原理,现抽空写一篇总结,来加深自己对这块的理解. 内容 概述 And ...

  5. PyTorch训练中Dataset多线程加载数据,比Dataloader里设置多个workers还要快

    PyTorch训练中Dataset多线程加载数据,而不是在DataLoader 背景与需求 现在做深度学习的越来越多人都有用PyTorch,他容易上手,而且API相对TF友好的不要太多.今天就给大家带 ...

  6. 【PyTorch训练中Dataset多线程加载数据,比Dataloader里设置多个workers还要快】

    文章目录 一.引言 二.背景与需求 三.方法的实现 四.代码与数据测试 五.测试结果 5.1.Max elapse 5.2.Multi Load Max elapse 5.3.Min elapse 5 ...

  7. Unity导表工具Luban插件的数据加载原理与优化

    文章目录 1. 配置Luban并测试 2. Luban 数据加载原理 3. 根据工程进行懒加载优化 3.1 增加公共接口与接口实现方法 3.2 外部提供获取数据的方法 3.3 对Luban中的导表模板 ...

  8. 【Docker镜像文件加载原理生产中重新制作并提交镜像文件案例演示】

    一.知识回顾 之前的内容都帮你整理好了,在这里哟! [0.Docker相关目录文章整理,可自行查看,包含多节内容] [1.Docker详细安装部署&阿里镜像地址配置] [2.Docker架构& ...

  9. 老调重弹:JDBC系列之驱动加载原理全面解析)

    前言 最近在研究Mybatis框架,由于该框架基于JDBC,想要很好地理解和学习Mybatis,必须要对JDBC有较深入的了解.所以便把JDBC 这个东东翻出来,好好总结一番,作为自己的笔记,也是给读 ...

最新文章

  1. C语言嵌入式系统编程修炼
  2. Flutter AnimatedAlign 使用解析
  3. 霍尼韦尔dcs系统组态手册_DCS和PLC有“血缘关系”吗?
  4. python调用c++动态库_Python应用:调用C/C++动态链接库的方法详解
  5. MySQL 5.6和MySQL 5.7的区别
  6. LayaAir 屏幕适配-分辨率、对齐模式
  7. mysql外键英文_MySQL开发中的外键(foreign key)与参照完整性(Referential integrity) [中英文转载]...
  8. JAVA中jspinner设置选中内容_java – 如何在JSpinner中获取所选项的值?
  9. 推荐系统实践--第七章:推荐系统实例 第八章:评分预测问题
  10. 2022 年顶级网络安全专家最爱用的10大工具
  11. 【滤波器】7. 带通滤波器
  12. rda分析怎么做_PCA、PCoA、NMDS 、RDA和CCA等排序分析方法
  13. 层次分析法(AHP)模型的应用案例
  14. angular pipe
  15. Android Calander Event
  16. loss scale的理解
  17. Github 之删除文件或者文件夹(不影响本地文件,只删除远端的指定文件或者文件夹) 操作
  18. 如何让U盘同时兼容Windows和Mac OS X系统
  19. 一个基于pycuda的矩阵乘法实现,它使用CUDA核心来
  20. 【Unity3D】关于 InputManager 以及改键功能的制作

热门文章

  1. 2021年香河一中高考成绩查询,2021年廊坊高考状元名单公布,廊坊文理科状元是谁多少分...
  2. 计算机语言中tc是什么,新人必须了解的几个TC常用语和脚本基础知识!
  3. 基于javaweb SSM邮件收发信息系统设计和实现以及文档
  4. Java--Mybatis万字长文经典面试题王者笔记《收藏版》
  5. android分辨率px跟dp,Android屏幕适配 px,dp,dpi及density的关系与深入理解
  6. java下文_java实现文件下载的两种方式
  7. Spring Boot 分布式会话
  8. Spring Boot 页面国际化
  9. Redis Spring集成
  10. redis timeout设置多少合适_热水器怎么调温度?一般热水器温度设置多少度比较合适?...