多-threaded负荷plist特征。获取知识的必要性:

1.多线程开启:pthread

2.怎样在线程中载入plist

一.多线程开启

当我们想在程序中开多线程中。第一想到的是cocos2d-x有没有自带方法。幸运的是我们找到了CCThread,不幸却发现里面什么都没有。

cocos2d-x自带了一个第三方插件--pthread,在cocos2dx\platform\third_party\win32\pthread能够找到。既然是自带的,必须它的理由。想在VS中应用这个插件须要两个步骤:

1.须要右键project--属性--配置属性--链接器--输入--编缉右側的附加依赖项--在当中加入pthreadVCE2.lib,例如以下图所看到的:

2..须要右键project--属性--配置属性--C/C++--常规--编缉右側的附加包括文件夹--加入新行--找到pthread文件夹所在位置。例如以下图所看到的:

然后我们就能够应用这个插件在程序中开启新线程。简单线程开启方法例如以下代码所看到的:

头文件:

  1. #ifndef _LOADING_SCENE_H__
  2. #define _LOADING_SCENE_H__
  3. #include "cocos2d.h"
  4. #include "pthread/pthread.h"
  5. class LoadingScene : public cocos2d::CCScene{
  6. public:
  7. virtual bool init();
  8. CREATE_FUNC(LoadingScene);
  9. int start();
  10. void update(float dt);
  11. private:
  12. pthread_t pid;
  13. static void* updateInfo(void* args); //注意线程函数必须是静态的
  14. };

cpp文件

  1. #include "LoadingScene.h"
  2. #include "pthread/pthread.h"
  3. using namespace cocos2d;
  4. bool LoadingScene::init(){
  5. this->scheduleUpdate();
  6. start();
  7. return true;
  8. }
  9. void LoadingScene::update(float dt){
  10. //能够在这里重绘UI
  11. }
  12. void* LoadingScene::updateInfo(void* args){
  13. //能够在这里载入资源
  14. return NULL;
  15. }
  16. int LoadingScene::start(){
  17. pthread_create(&pid,NULL,updateInfo,NULL); //开启新线程
  18. return 0;
  19. }

二 载入Plist

我们能够在新开的线程中。载入资源,设置一个静态变量bool,在新线程中。当载入全然部资源后,设置bool值为真。在主线程中Update中,检測bool值,为假,能够重绘UI(比如,显示载入图片,或者模拟载入进度),为真,则载入目标场景。相关代码例如以下:

  1. void* LoadingScene::updateInfo(void* args){
  2. CCSpriteFrameCache *cache = CCSpriteFrameCache::sharedSpriteFrameCache();
  3. cache->addSpriteFramesWithFile("BattleIcons.plist");
  4. cache->addSpriteFramesWithFile("ArcherAnim.plist");
  5. cache->addSpriteFramesWithFile("DeathReaperAnim.plist");
  6. loadComplete = true;  //状态值设为真,表示载入完毕
  7. return NULL;
  8. }

成功载入且执行后,你会发现新场景中全部精灵都不显示(类似于黑屏了)。为什么呢?

由于我们在载入plist文件时,addSpriteFramesWithFile方法里会帮我们创建plist相应Png图的Texture2D,并将其载入进缓存中。但是这里就遇到了一个OpenGl规范的问题:不能在新开的线程中。创建texture,texture必须在主线程创建.通俗点,就是全部的opengl api都必须在主线程中调用;其他的操作,比方文件,内存。plist等,能够在新线程中做,这个不是cocos2d不支持,是opengl的标准,无论你是在android,还是windows上使用opengl,都是这个原理。

所以不能在新线程中创建Texture2D,导致纹理都不显示。那么该怎么办?让我们看看CCSpriteFrameCache源代码。发现CCSpriteFrameCache::addSpriteFramesWithFile(const char *pszPlist, CCTexture2D *pobTexture)方法,是能够传入Texture2D參数的。

是的。我们找到了解决方法:

相关代码例如以下:

  1. int LoadingScene::start(){
  2. CCTexture2D *texture = CCTextureCache::sharedTextureCache()->addImage("BattleIcons.png"); //在这里(主线程中)载入plist相应的Png图片进纹理缓存
  3. CCTexture2D *texture2 = CCTextureCache::sharedTextureCache()->addImage("ArcherAnim.png"); //以这样的方法载入的纹理,其Key值就是文件path值,即比如
  4. texture2的key值就是ArcherAnim.png
  5. CCTexture2D *texture3 = CCTextureCache::sharedTextureCache()->addImage("DeathReaperAnim.png");
  6. pthread_create(&pid,NULL,updateInfo,NULL); //开启新线程
  7. return 0;
  8. }
  9. void* LoadingScene::updateInfo(void* args){
  10. CCSpriteFrameCache *cache = CCSpriteFrameCache::sharedSpriteFrameCache();
  11. CCTextureCache* teCache = CCTextureCache::sharedTextureCache();
  12. CCTexture2D* texture1 = teCache->textureForKey("BattleIcons.png"); //从纹理缓存中取出Texure2D,并将其当參数传入addSpriteFramesWithFile方法中
  13. cache->addSpriteFramesWithFile("BattleIcons.plist",texture1);
  14. CCTexture2D* texture2 = teCache->textureForKey("ArcherAnim.png");
  15. cache->addSpriteFramesWithFile("ArcherAnim.plist",texture2);
  16. CCTexture2D* texture3 = teCache->textureForKey("DeathReaperAnim.png");
  17. cache->addSpriteFramesWithFile("DeathReaperAnim.plist",texture3);
  18. loadComplete = true;
  19. return NULL;
  20. }

解决。这是不是违背OpenGl产品规格,不要创建一个新的线程Texture2D。


Cocos2dx 多线程的更多相关文章

  1. cocos2d-x 多线程以及线程同步

    转自:http://blog.csdn.net/zhy_cheng/article/details/9116479 cocos2d-x引擎在内部实现了一个庞大的主循环,每帧之间更新界面,如果耗时的操作 ...

  2. Cocos2d-X多线程(3) cocos2dx中的线程安全

    在使用多线程时,总会遇到线程安全的问题.cocos2dx 3.0系列中新加入了一个专门处理线程安全的函数performFunctionInCocosThread(),他是Scheduler类的一个成员 ...

  3. Cocos2d-X多线程(1) 在cocos2d-x中使用多线程

    教科书上说:进程是资源分配的最小单位,线程是CPU调度的最小单位. 进程是程序在计算机上的一次执行活动.直观的讲就是会产生一个pid. int main() {     //业务逻辑代码     re ...

  4. Cocos2d-X多线程(4) 在子线程中进行网络请求

    新版本的android系统已经不允许在UI线程中进行网络请求了,必须新建一个线程. 代码实操: 头文件: #ifndef __TestThreadHttp_SCENE_H__ #define __Te ...

  5. Cocos2d-X多线程(2) 线程的互斥量std::mutex和线程锁

    多个线程同时访问共享资源时,经常会出现冲突等.为了避免这种情况的发生,可以使用互斥量,当一个线程锁住了互斥量后,其他线程必须等待这个互斥量解锁后才能访问它. thread提供了四种不同的互斥量: 1. ...

  6. 关于Cocos2d-x多线程异步载入资源的问题

    我们通常使用CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("xxx.plist" ...

  7. [转]eoe社区cocos2d-x游戏引擎知识大汇总

    [eoeAndroid 社区]特意为大家汇总了cocos2d-x知识贴,分量十足,纯正干或.从基础教程到游戏应用的开发,我们不让知识流失,我们要做知识的搬运工还有加工 师.希望大家能够一起的学习,和大 ...

  8. Cocos2d-x视频教程

    目录 1. 我的技术专栏 2. 相关推荐 3. 下载链接 4. cocos2d-xx Lua+JS+C++教学视频 5. 杨丰盛Cocos2D-X游戏课程 6. [Cocos2d-x]塔防游戏开发实战 ...

  9. 【转】【玩转cocos2d-x之二十三】多线程和同步03-图片异步加载

    原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/15334159 cocos2d-x中和Android,Windows都 一样, ...

随机推荐

  1. Oracle_Flashback_技术_总结

    Oracle Flashback 技术 总结 Flashback 技术是以Undo segment中的内容为基础的, 因此受限于UNDO_RETENTON参数.要使用flashback 的特性,必须启 ...

  2. POJ3185 The Water Bowls(反转法or dfs 爆搜)

    POJ3185 The Water Bowls 题目大意: 奶牛有20只碗摆成一排,用鼻子顶某只碗的话,包括左右两只在内的一共三只碗会反向,现在给出碗的初始状态,问至少要用鼻子顶多少次才能使所有碗都朝 ...

  3. Python网页爬虫(一)

    很多时候我们想要获得网站的数据,但是网站并没有提供相应的API调用,这时候应该怎么办呢?还有的时候我们需要模拟人的一些行为,例如点击网页上的按钮等,又有什么好的解决方法吗?这些正是python和网页爬 ...

  4. 【转】从头到尾彻底理解KMP

    很好,讲得很清晰,值得学习. 作者:July时间:最初写于2011年12月,2014年7月21日晚10点 全部删除重写成此文,随后的半个月从早到晚不断改进. 1. 引言 本KMP原文最初写于2年多前的 ...

  5. C++封装常用对象和对头文件探索

    在C++实际开发中,难免会使用到一些你极为常用的算法(比如笔者经常使用的多线程技术),实现这些算法的类或是全局函数或是命名空间等等经常都要被使用多次,你会有哪些办法来使用呢?笔者有4个办法. 第一个方 ...

  6. Ajax的load方法演示

    load方法的参数形式为: load(url,[data],[callback]); 其中url为请求HTML页面的URL地址.[data]表示发送至服务器的key/value数据.callback表 ...

  7. 无法嵌入互操作类型“Microsoft.Office.Interop.Word.ApplicationClass”。请改用适用的接口。

    引用里找到Microsoft.Office.Interop.Word右键属性 在嵌入互操作类型里,选上False就行了.

  8. Kohana框架ORM类的基本使用

    1.首先需要创建一个模型类,以user为例,在application/classes/model/user.php路径下创建user.php,并且一个表对应一个模型,且表名必须在类名后加“S”,即表名 ...

  9. 以k个元素为一组反转单链表

    Example: input: 1->2->3->4->5->6->7->8->NULL and k = 3 output:3->2->1- ...

  10. centos下安装cdh5

    http://www.aboutyun.com/thread-9075-1-1.html 基本参考这个   yum clean all yum update     1.保证selinux关闭  /e ...