详解Cocos2D-X游戏开发中的多线程和同步

    作者:课课家教育更新于: 2019-04-15 09:42:43

      上一篇教程我们了解了如何在Cocos2d-x中创建线程,接下来我们来看看本篇教程详细了解一下Cocos2D-X游戏开发中的多线程与同步。

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

      1.配置

      在使用pthread之前,需要把头文件和库文件链接进来。pthread的官网戳这里,当然cocos2d-x帮我们包含进引擎了。

      1.1.头文件

      pthread.h放在\\cocos2d-x目录\\cocos2dx\\platform\\third_party\\win32\\pthread\\下,右键项目→属性→配置属性→C/C++→附加包含目录添加如下,这里要注意附加包含目录是只包含当前目录下的文件,而不会包含该目录下子目录。

    详解Cocos2D-X游戏开发中的多线程和同步_Cocos2D-X线程_Cocos2D-X教程_Cocos2D-X游戏开发_课课家

      1.2.库文件

      一样的,右键项目→属性→配置属性→链接器→输入→附加依赖项,添加pthreadVCE2.lib即可。v2.2.0会自动包含,这步可省。

      2.pthread库

      2.1.主要功能

      pthread库包含了四大部分功能:

      (1)Thread Management:线程管理。提供了线程的创建,删除,结束等功能,也包含了对线程属性的修改和设置。

      (2)Mutexex:互斥对象。用于处理同步机制。提供了创建,销毁,加锁,解锁等功能,也包含了对互斥对象属性的修改和设置。

      (3)Condition variables:条件变量。提供了基于程序员提供条件的进程间通讯互斥锁的操作,包含了对其属性的修改和设置。

      (4)Synchronization:同步相关。提供了操作读写锁等功能。

      2.2.命名规则

      3.线程和互斥对象

      我们这里主要了解线程和互斥对象,也是最常用到的。

      3.1.线程

      //创建线程

      PTW32_DLLPORT int PTW32_CDECL pthread_create (pthread_t * tid,

      const pthread_attr_t * attr,

      void *(*start) (void *),

      void *arg);

      //退出线程

      PTW32_DLLPORT void PTW32_CDECL pthread_exit (void *value_ptr);

      //取消执行线程

      PTW32_DLLPORT int PTW32_CDECL pthread_cancel (pthread_t thread);

      //删除线程

      PTW32_DLLPORT int PTW32_CDECL pthread_detach (pthread_t tid);

      //加入线程

      PTW32_DLLPORT int PTW32_CDECL pthread_join (pthread_t thread,

      void **value_ptr);

      //初始化线程属性

      PTW32_DLLPORT int PTW32_CDECL pthread_attr_init (pthread_attr_t * attr);

      //清理线程属性

      PTW32_DLLPORT int PTW32_CDECL pthread_attr_destroy (pthread_attr_t * attr);

      3.2.互斥对象

      //初始化mutex

      PTW32_DLLPORT int PTW32_CDECL pthread_mutex_init (pthread_mutex_t * mutex,

      const pthread_mutexattr_t * attr);

      //销毁mutex,要注意如果是new的指针,需要手动释放,pthread_mutex_destroy并不会帮你释放

      PTW32_DLLPORT int PTW32_CDECL pthread_mutex_destroy (pthread_mutex_t * mutex);

      //加锁

      PTW32_DLLPORT int PTW32_CDECL pthread_mutex_lock (pthread_mutex_t * mutex);

      //尝试加锁

      PTW32_DLLPORT int PTW32_CDECL pthread_mutex_trylock (pthread_mutex_t * mutex);

      //解锁

      PTW32_DLLPORT int PTW32_CDECL pthread_mutex_unlock (pthread_mutex_t * mutex);

      要注意的是mutex变量必须要被声明为pthread_mutex_t类型,且在使用前必须要被初始化,初始化有2种方式:

      (1)静态初始化

      pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIALIZER;

      (2)动态初始化

      pthread_mutex_init();

      4.注意

      cocos2d-x使用多线程应注意的问题:

      (1)不能调用涉及到CCObject::retain(), CCObject::release() 或者 CCObject::autorelease()的函数,因为CCAutoreleasePool不是线程安全的。因为cocos2d-x框架中无处不在使用CCAutoreleasePool,所以建议不要在新线程中调用cocos2d-x的API。

      (2)如果要在新线程中加载资源,那么可以使用CCTextureCache::addImageAsync()。

      (3)pthread_cond_wait()看起来有个bug,首次wait会失败,但是之后又会工作的很好。

      (4)OpenGL context也不是线程安全。

课课家教育

未登录