您的位置:首页 > 移动开发 > Cocos引擎

Cocos笔记_Cocos3.0+版本的多线程

2016-12-04 18:35 393 查看
之前从未接触过多线程的概念。今天来学习一下。

多线程

1.作用:Cocos中有一个自己的主循环。如果很耗时的操作(比如:资源加载等)写在主循环中。则游戏会出现卡顿,这是对于游戏体验来说是很致命的。此时多线程就可以登场了。

2.在Cocos2.x版本中使用的是pthread库。而在3.x版本中,默认编译器是VS2012+,包含了C11的新特性,所以可以直接使用C11中std::thread来创建线程。所以就不管2.x版本的那个pthread,反正本大王没有学过。

3.要使用thread需要包含thread库
#include<thread>


4.join()函数是等待子线程结束后,再继续执行主线程。此时主线程执行完之后的子线程资源。

示例代码:

bool HelloWorld::init()
{
if(!Layer::init())
{
return false;
}

std::thread t1(&HelloWorld::myThread,this);
t1.join()
//t1.detach();
CCLOG("在主线程中");
return true;
}
void HelloWorld::myThread()
{
CCLOG("在分支线程中");
}
/*
结果如下:
在分支线程中
线程...已退出,返回值为0。
在主线程中
*/


5.如果想要让主线程不需要等待子线程贼可以调用detach()。detach()会将子线程从主线程中分离出来,子线程执行完会自己释放掉子线程的资源。但子线程分离后,之线程则失去了对子线程的控制权。

示例代码:

std::thread t1(&HelloWorld::myThread,this);
t1.detach();
/*
执行结果如下:
在主线程中
在分支线程中
*/


6.向子线程中传递参数

bool HelloWorld::init()
{
if(!Layer::init())
{
return false;
}

std::thread t1(&HelloWorld::myThread,this,100,200);
t1.join()
//t1.detach();
CCLOG("在主线程中");
return true;
}

void HelloWorld::myThread(int first,int second)
{
CCLOG("在子线程中,第一个参数为%d,第二个参数为%d",first,second);
}
/*
运行结果为:
在子线程中,第一个参数为100,第二个参数为200
线程...已退出,返回值为0。
在主线程中
*/


简单的线程使用大概学到这里。还有一些复杂的用法日后再说。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息