zoukankan      html  css  js  c++  java
  • Cocos2d-X多线程(1) 在cocos2d-x中使用多线程

    教科书上说:进程是资源分配的最小单位,线程是CPU调度的最小单位。
    进程是程序在计算机上的一次执行活动。直观的讲就是会产生一个pid。
    int main()
    {
        //业务逻辑代码
        return 0;
    }
    当进入main函数时就会创建一个进程。
    线程是可执行代码的可分派单元。线程把一个进程分为很多片,每一片都可以是一个独立的流程。
    为什么使用多线程和多进程:
    为了实现并发执行,就是在同一时间同时执行多条任务。这样可以提高程序效率。
     
    在cocos2d-x中使用多线程:
    游戏中的界面体验很重要,最基本的条件就是流程性,并且在cocos2d开发的游戏中,每帧都要刷新一下界面,按60fps算,每秒刷新60次。所以可以把耗时的操作放到其他线程中,就不会对界面线程造成影响。

    cocos2d-x 3.0系列版本使用了c++11,C++11提供了一个更好的用于线程操作的类std::thread,std::thread 在 <thread> 头文件中声明,因此使用 std::thread 时需要包含 <thread> 头文件。
    std::thread 常用构造函数:
    1、默认构造函数:thread()
      默认构造函数,创建一个空的 thread 执行对象
         std::thread t1;
    2、初始化构造函数:template <class Fn, class... Args>
      初始化构造函数,创建一个 thread对象,该 thread对象可被 joinable,新产生的线程会调用 fn 函数,该函数的参数由 args 给出。
         std::thread t2(f1, 10);
    常用函数:
    1、get_id
       获取线程 ID。
    2、joinable
       检查线程是否可被 join。
    3、join
       Join 线程。待子线程执行完之后,主线程才可以继续执行下去,此时主线程会释放掉执行完后的子线程资源
    4、detach
       Detach 线程
       将子线程从主线程里分离,子线程执行完成后会自己释放掉资源。分离后的线程,主线程将对它没有控制权了。
     


    代码实操:

    头文件:

    #ifndef __TestThread_SCENE_H__
    #define __TestThread_SCENE_H__
    
    #include "cocos2d.h"
    
    
    USING_NS_CC;
    
    class TestThread : public cocos2d::Layer
    {
    public:
        static cocos2d::Scene* createScene();
        virtual bool init();
    	CREATE_FUNC(TestThread);
    	
    	Label *lblInit;
    	void threadA(int first,std::string second);
    };
    
    #endif // __TestThread_SCENE_H__
    

    源文件:

    #include "TestThread.h"
    #include <thread>
    
    Scene* TestThread::createScene()
    {
        auto scene = Scene::create();
        auto layer = TestThread::create();
        scene->addChild(layer);
        return scene;
    }
    
    bool TestThread::init()
    {
        if ( !Layer::init() )
        {
            return false;
        }
    
    	Size size = Director::getInstance()->getVisibleSize();
    	lblInit = Label::create("hi","Arial",24);
    	addChild(lblInit);
    	lblInit->setPosition(size/2);
    
    	// 创建一个线程
    	std::thread t1(&TestThread::threadA,this,10,"I am a string");
    	// 分离线程
    	t1.detach();
    	lblInit->setString("main thread");
    	
        return true;
    }
    void TestThread::threadA(int first,std::string second)
    {
    	std::this_thread::sleep_for(std::chrono::seconds(3));
    	lblInit->setString("threadA");
    	log("threadA first = %d,second = %s",first,second.c_str());
    }


     
     

  • 相关阅读:
    SpringBoot Data Jpa基本使用
    spring cloud oauth2(五) 白名单设置
    spring cloud oauth2(四) 资源服务搭建
    spring cloud oauth2(三) 自定义授权类型 手机号+短信验证码
    spring cloud oauth2(二) 自定义授权类型 图片验证码
    spring cloud oauth2(一) 授权服务搭建
    设计模式 选自《闻缺陷则喜》此书可免费下载
    设计模式六大原则 节选自《闻缺陷则喜》(此书可免费下载)
    架构模式 节选自《闻缺陷则喜》(此书可免费下载)
    架构内容 节选自《闻缺陷则喜》(此书可免费下载)
  • 原文地址:https://www.cnblogs.com/lmx282110xxx/p/10798712.html
Copyright © 2011-2022 走看看