cocos2d-x多线程 plist(转)

转载 2014年01月07日 13:45:56

转自:http://blog.sina.com.cn/s/blog_7608655901017s2b.html


最近在修改一个cocos2d的项目,要把它移植到cocos2d-x,原来的项目中用到了多线程,但是在cocos2d-x中的实现有点不太一样,在CSDN上找了一篇文章,有详细的代码示例:在新的线程中加载资源文件。原文地址:http://blog.csdn.net/we000636/article/details/8641270

原文章是在windows系统下讲解的,在xcode中同样需要导入pThread类库。

简单线程开启方法如下代码所示:

头文件:

.h

#ifndef _LOADING_SCENE_H__  
  1. #define _LOADING_SCENE_H__  
  2.   
  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 voidupdateInfo(voidargs); //注意线程函数必须是静态的  
  14. };  



 

cpp文件
#include "LoadingScene.h"  

  1. #include "pthread/pthread.h"  
  2.   
  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. voidLoadingScene::updateInfo(voidargs){  
  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(例如,显示加载图片,或者模拟加载进度),为真,则加载目标场景。相关代码如下:

voidLoadingScene::updateInfo(voidargs){  
  1.      CCSpriteFrameCache *cache CCSpriteFrameCache::sharedSpriteFrameCache();  
  2.      cache->addSpriteFramesWithFile("BattleIcons.plist");  
  3.      cache->addSpriteFramesWithFile("ArcherAnim.plist");  
  4.      cache->addSpriteFramesWithFile("DeathReaperAnim.plist");  
  5.      loadComplete true //状态值设为真,表示加载完成  
  6.      return NULL;  
  7.  



 

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

因为我们在加载plist文件时,addSpriteFramesWithFile方法里会帮我们创建plist对应Png图的Texture2D,并将其加载进缓存中。可是这里就遇到了一个OpenGl规范的问题:不能在新开的线程中,创建texture,texture必须在主线程创建.通俗点,就是所有的opengl api都必须在主线程中调用;其它的操作,比如文件,内存,plist等,可以在新线程中做,这个不是cocos2d不支持,是opengl的标准,不管你是在android,还是windows上使用opengl,都是这个原理。

所以不能在新线程中创建Texture2D,导致纹理都不显示,那么该怎么办?让我们看看CCSpriteFrameCache源码,发现CCSpriteFrameCache::addSpriteFramesWithFile(constchar *pszPlist, CCTexture2D*pobTexture)方法,是可以传入Texture2D参数的。是的,我们找到了解决方法:

相关代码如下:

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



 

这样解决,就不违背OpenGl规范,没有在新线程中创建Texture2D。

相关文章推荐

Cocos2d-x 中使用多线程

  • 2013年08月11日 01:14
  • 4.75MB
  • 下载

cocos2d-x多线程和同步

  • 2013年11月05日 10:10
  • 182KB
  • 下载

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

原文链接:http://blog.csdn.net/jackystudio/article/details/15334159 原创作品,转载请标明:http://blog.csdn.net/...

cocos2d-x多线程

  • 2013年06月18日 00:42
  • 804KB
  • 下载

cocos2d-x多线程异步加载资源

  • 2014年08月08日 14:48
  • 16KB
  • 下载

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

cocos2d-x中和Android,Windows都一样,如果在主线程中处理一些耗时操作,那么主线程就会出现阻塞现象,表现在界面上就是卡住,未响应等情况。为了避免这种情况的出现,我们需要在后台开辟工...

cocos2d-x 多线程以及线程同步(转)

(转)http://blog.csdn.net/zhy_cheng/article/details/9116479 cocos2d-x引擎在内部实现了一个庞大的主循环,每帧之间更新界面,如果耗时...
  • hhy018
  • hhy018
  • 2013年12月21日 13:30
  • 653

【玩转cocos2d-x之二十二】多线程和同步02-售票

pthread有很多不同应用,官网都有相应的API解释和Sample,这里不再重复,本文主要介绍cocos2d-x中一个多线程和同步示例。 1.卖票 孙鑫老师的C++和Java多线程卖票一直让我念...

【玩转cocos2d-x之二十一】多线程和同步01-pthread库

和其他框架一样,cocos2d-x允许我们使用多线程进行编程。cocos2d-x使用的是pthread库,是一套用户级线程库,被广泛地使用在跨平台应用上。 1.配置 在使用pthread之前,需要...

cocos2d-x 中多线程的c/c++代码通过JNI调用java代码

Cocos2dx 的多线程c/c++通过JNI调用java的代码
  • wu4long
  • wu4long
  • 2014年01月02日 15:49
  • 3519
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:cocos2d-x多线程 plist(转)
举报原因:
原因补充:

(最多只允许输入30个字)