Cocos2dx 多线程
多-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文件夹所在位置。例如以下图所看到的:

然后我们就能够应用这个插件在程序中开启新线程。简单线程开启方法例如以下代码所看到的:
头文件:
- #ifndef _LOADING_SCENE_H__
- #define _LOADING_SCENE_H__
- #include "cocos2d.h"
- #include "pthread/pthread.h"
- class LoadingScene : public cocos2d::CCScene{
- public:
- virtual bool init();
- CREATE_FUNC(LoadingScene);
- int start();
- void update(float dt);
- private:
- pthread_t pid;
- static void* updateInfo(void* args); //注意线程函数必须是静态的
- };
cpp文件
- #include "LoadingScene.h"
- #include "pthread/pthread.h"
- using namespace cocos2d;
- bool LoadingScene::init(){
- this->scheduleUpdate();
- start();
- return true;
- }
- void LoadingScene::update(float dt){
- //能够在这里重绘UI
- }
- void* LoadingScene::updateInfo(void* args){
- //能够在这里载入资源
- return NULL;
- }
- int LoadingScene::start(){
- pthread_create(&pid,NULL,updateInfo,NULL); //开启新线程
- return 0;
- }
二 载入Plist
我们能够在新开的线程中。载入资源,设置一个静态变量bool,在新线程中。当载入全然部资源后,设置bool值为真。在主线程中Update中,检測bool值,为假,能够重绘UI(比如,显示载入图片,或者模拟载入进度),为真,则载入目标场景。相关代码例如以下:
- void* LoadingScene::updateInfo(void* args){
- CCSpriteFrameCache *cache = CCSpriteFrameCache::sharedSpriteFrameCache();
- cache->addSpriteFramesWithFile("BattleIcons.plist");
- cache->addSpriteFramesWithFile("ArcherAnim.plist");
- cache->addSpriteFramesWithFile("DeathReaperAnim.plist");
- loadComplete = true; //状态值设为真,表示载入完毕
- return NULL;
- }
成功载入且执行后,你会发现新场景中全部精灵都不显示(类似于黑屏了)。为什么呢?
由于我们在载入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參数的。
是的。我们找到了解决方法:
相关代码例如以下:
- int LoadingScene::start(){
- CCTexture2D *texture = CCTextureCache::sharedTextureCache()->addImage("BattleIcons.png"); //在这里(主线程中)载入plist相应的Png图片进纹理缓存
- CCTexture2D *texture2 = CCTextureCache::sharedTextureCache()->addImage("ArcherAnim.png"); //以这样的方法载入的纹理,其Key值就是文件path值,即比如
- texture2的key值就是ArcherAnim.png
- CCTexture2D *texture3 = CCTextureCache::sharedTextureCache()->addImage("DeathReaperAnim.png");
- pthread_create(&pid,NULL,updateInfo,NULL); //开启新线程
- return 0;
- }
- void* LoadingScene::updateInfo(void* args){
- CCSpriteFrameCache *cache = CCSpriteFrameCache::sharedSpriteFrameCache();
- CCTextureCache* teCache = CCTextureCache::sharedTextureCache();
- CCTexture2D* texture1 = teCache->textureForKey("BattleIcons.png"); //从纹理缓存中取出Texure2D,并将其当參数传入addSpriteFramesWithFile方法中
- cache->addSpriteFramesWithFile("BattleIcons.plist",texture1);
- CCTexture2D* texture2 = teCache->textureForKey("ArcherAnim.png");
- cache->addSpriteFramesWithFile("ArcherAnim.plist",texture2);
- CCTexture2D* texture3 = teCache->textureForKey("DeathReaperAnim.png");
- cache->addSpriteFramesWithFile("DeathReaperAnim.plist",texture3);
- loadComplete = true;
- return NULL;
- }
解决。这是不是违背OpenGl产品规格,不要创建一个新的线程Texture2D。
Cocos2dx 多线程的更多相关文章
- cocos2d-x 多线程以及线程同步
转自:http://blog.csdn.net/zhy_cheng/article/details/9116479 cocos2d-x引擎在内部实现了一个庞大的主循环,每帧之间更新界面,如果耗时的操作 ...
- Cocos2d-X多线程(3) cocos2dx中的线程安全
在使用多线程时,总会遇到线程安全的问题.cocos2dx 3.0系列中新加入了一个专门处理线程安全的函数performFunctionInCocosThread(),他是Scheduler类的一个成员 ...
- Cocos2d-X多线程(1) 在cocos2d-x中使用多线程
教科书上说:进程是资源分配的最小单位,线程是CPU调度的最小单位. 进程是程序在计算机上的一次执行活动.直观的讲就是会产生一个pid. int main() { //业务逻辑代码 re ...
- Cocos2d-X多线程(4) 在子线程中进行网络请求
新版本的android系统已经不允许在UI线程中进行网络请求了,必须新建一个线程. 代码实操: 头文件: #ifndef __TestThreadHttp_SCENE_H__ #define __Te ...
- Cocos2d-X多线程(2) 线程的互斥量std::mutex和线程锁
多个线程同时访问共享资源时,经常会出现冲突等.为了避免这种情况的发生,可以使用互斥量,当一个线程锁住了互斥量后,其他线程必须等待这个互斥量解锁后才能访问它. thread提供了四种不同的互斥量: 1. ...
- 关于Cocos2d-x多线程异步载入资源的问题
我们通常使用CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("xxx.plist" ...
- [转]eoe社区cocos2d-x游戏引擎知识大汇总
[eoeAndroid 社区]特意为大家汇总了cocos2d-x知识贴,分量十足,纯正干或.从基础教程到游戏应用的开发,我们不让知识流失,我们要做知识的搬运工还有加工 师.希望大家能够一起的学习,和大 ...
- Cocos2d-x视频教程
目录 1. 我的技术专栏 2. 相关推荐 3. 下载链接 4. cocos2d-xx Lua+JS+C++教学视频 5. 杨丰盛Cocos2D-X游戏课程 6. [Cocos2d-x]塔防游戏开发实战 ...
- 【转】【玩转cocos2d-x之二十三】多线程和同步03-图片异步加载
原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/15334159 cocos2d-x中和Android,Windows都 一样, ...
随机推荐
- iOS中使用正则表达式去掉HTML中的标签元素获得纯文本的方法
content是根据网址获得的网页源码字符串 - (NSString *)changeToString:(NSString *)content { NSRegularExpression *regul ...
- app发布流程详解
https://developer.apple.com 1. 点击 Member Center 2. 创建应用ID 3. 创建项目 4. 在AppStore创建对应的应用 5. 创建授权文件 6. 配 ...
- nodejs概论(实操篇)
什么是模块? 模块分为原生模块(node.jsAPI提供的原生模块,在启动时已经被加载)和 文件模块(动态加载模块,主要由原生模块module来实现和完成.通过调 用node.js的require方法 ...
- Multiple dex files define Lcom/sina/sso/RemoteSSO错误解决办法
在安卓上遇到了Multiple dex files define Lcom/sina/sso/RemoteSSO的编译错误 在网上找解决办法 搜到了解决办法是这样的 方案1:Eclipse->P ...
- javascript关于原型的深刻理解
Javascript继承机制的设计思想 作者: 阮一峰 日期: 2011年6月 5日 我一直很难理解Javascript语言的继承机制. 它没有"子类"和"父类&qu ...
- XmlHttp对象
我是这样理解XmlHttp对象的:xml是一种文档类型Http可以把它看做是浏览器XmlHttp:可以解释为把xml的内容读到浏览器上(网页上),把这句话封装一下,见下XmlHttp是浏览器对象,起的 ...
- [Python笔记]第八篇:模块
本篇主要内容:python常用模块用法介绍 什么是模块 模块,用一大段代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性 ...
- The '_imaging' module for the PIL could not be imported: DLL load failed: The specified module could not be found
I uninstalled the PIL and installed the Pillow and the problem solved.PIL worked fine for me with th ...
- Python三元表达式
我们知道Python没有三元表达式,但是我们通过技巧达到三元表达式的效果. 摘自<Dive Into Python>: 在Python 中,and 和 or 执行布尔逻辑演算,如你所期待的 ...
- 温故而知新 C++ 类型转换
C语言类型转换 在C语言里用到的类型转换方式,一般都是用强制类型转换,语法:(类型说明符)(表达式),例如: (float)a 把a转换为实型,(int)(x+y) 把x+y的结果转换为整型.C语言这 ...