cocos2d-x 多线程、线程同步

本文介绍如何在Cocos2d-x中利用pthread实现多线程,包括环境搭建、常用函数解析及示例代码,并强调了多线程使用时的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

cocos2d-x引擎在内部实现了一个庞大的主循环,每帧之间更新界面,如果耗时的操作放到了主线程中,游戏的界面就会卡,这是不能容忍的,游戏最基本的条件就是流畅性,这就是为什么游戏开发选择C++的原因。另外现在双核手机和四核手机越来越普遍了,是时候使用多线程来挖掘硬件的潜力了。

1.环境搭建

cocos2d-x中的多线程使用pthread就可以实现跨平台,而且也不是很难理解。使用pthread需要先配置一下工程。右击工程----->属性----->配置属性---->链接器----->输入---->附加依赖项中添加pthreadVCE2.lib,如下图

接着添加附加包含目录,右击项目,属性----->C/C++---->常规----->附加包含目录加入pthread头文件所在的目录

这样,环境就搭建起来了。

2.多线程的使用

使用pthread来实现多线程,最重要的一个函数是

  1. PTW32_DLLPORT int PTW32_CDECL pthread_create (pthread_t * tid,//线程的标示  

  2.                             const pthread_attr_t * attr,      //创建线程的参数  

  3.                             void *(*start) (void *),          //入口函数的指针  

  4.                             void *arg);                       //传递给线程的数据  

在cocos2d-x中多线程一般是使用pthread,下面先来说一下pthread中比较常用的几个方法,后面再给出一个简单的创建多线程的例子。

参数tid指向保存线程ID的pthread_t结构。参数attr表示一个封装了线程的各种属性的属性对象,用来配置线程的运行,如果为NULL,则使新线程具有默认的属性。第三个参数start是线程开始执行的时候调用的函数的名字,返回的void指针将被pthread_join函数当作退出状态来处理。第四个参数arg正是传递给start函数的参数。


int pthread_join(pthread_t thread, void **value_ptr);  使调用这个函数的线程等待指定的线程完成时在继续执行。thread为要等待的线程的id,参数value_ptr为指向返回值的指针提供一个位置,这个返回值是由目标线程传递给pthread_exit或return的。如果value_ptr为NULL,调用程序就不会对目标线程的状态进行检索了。  成功返回0,否则返回非0的错误代码。


void pthread_exit(void *value_ptr); 使调用该函数的线程终止。可以传递一个指针用来指向线程的返回值。


int pthread_cancle(pthread_t thread);  参数为要取消的线程的id,该函数不会阻塞调用线程。线程处于PTHREAD_CANCEL_ENABLE状态时才能够被取消. int pthread_setcancelstate(int state, int oldstate) 函数可以设置线程的取消状态。int pthread_setcanceltype(int type, int *oldtype) 设置线程的取消类型


获取互斥量
int pthread_mutex_lock(pthread_mutex_t *mutex);//使调用这个函数的线程一直阻塞直到互斥量可用为止
int pthread_mutex_trylock(pthread_mutex_t *mutex);//即时返回,如果互斥量空闲则得到它,否则返回EBUSY
释放互斥量
int pthread_mutex_unlock(pthread_mutex_t *mutex);//解锁
以上函数若成功返回0,否则返回非0的错误代码
 
在cocos2d-x中的使用:

在一个新的cocos2d-x中添加一个按钮,然后每次点击这个按钮就创建一个新线程,让这个新线程打印一个输出,那就让他输出hello world吧~
创建一个cocos2d-x新工程,添加按钮,按钮的回调方法暂且就叫menuCallBack吧。
在menuCallBack中添加如下代码:
do {
      int errCode = 0;
      pthread_attr_t attr;
      errCode = pthread_attr_init(&attr);
            
      CC_BREAK_IF(errCode != 0);
            
      errCode = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
            
      if (errCode != 0) {
         pthread_attr_destroy(&attr);
         break;
      }
            
      errCode = pthread_create(&pid, &attr, check, NULL);
            
} while (0);

再添加一个static方法,shuchu:(注意:shuchu()一定是一个static方法)

void* shuchu(void *) {
          CCLOG("Hello World...");
}

5.Cocos2d-x中使用多线程的注意事项

       Cocos2d-x所使用的内存管理机制以及OpenGL的接口函数都不是线程安全的,所以,不要试图在一个除主线程之外的其它线程内调用引擎所提供的内存管理的方法,例如在一个新线程中去创建一个精灵或是层之类的元素,这些元素在create()方法中均会调用autorelease,autorelease以及retain、release都不是线程安全的,OpenGL的上下文也不是线程安全的,所以也不要在新线程中去使用OpenGL的绘制功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值