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

【cocos2d-x 3.x】02-简单看一下cocos的消息循环的步骤

2014-12-06 22:22 363 查看

帧循环

cocos是如何保持60帧一秒的

在执行完applicationDidFinishLaunching中我们自定义的初始化代码后,便开始游戏的帧循环

while(!glview->windowShouldClose())

{

   QueryPerformanceCounter(&nNow);

    //计算当前时间与上一帧的时间间隔是否大于设定每帧的时间间隔(默认60帧/秒)

   if (nNow.QuadPart - nLast.QuadPart >_animationInterval.QuadPart)

   {

        nLast.QuadPart= nNow.QuadPart;//重置上一帧的时间

        director->mainLoop();    //开始进入主循环 mainLoop所做的事情

        glview->pollEvents();

   }

   else

   {

       //如果在一帧内,已经完成循环动作,则执行这里,确保每秒帧数达到设置值

        Sleep(0);

   }

}

mainLoop

mainLoop,顾名思义,这是游戏的主循环

void DisplayLinkDirector::mainLoop()

{

    if (_purgeDirectorInNextLoop)  

    {   //程序退出时做一些清理工作

        _purgeDirectorInNextLoop = false;

        purgeDirector();

    }

    else if (! _invalid)

    {

        drawScene();//绘制场景

        PoolManager::getInstance()->getCurrentPool()->clear(); //清除内存池中需要释放的资源

    }

}

drawScene

在drawScene函数中完成了重绘当前场景(遍历渲染树)、刷新状态信息等动作

void Director::drawScene()

{

    //如果下一个场景不为空,则将当前场景替换为_nextScene

    if (_nextScene)

       setNextScene();

 

    //如果当前存在运行场景

    if (_runningScene)

    {   //遍历场景中的子节点

       _runningScene->visit(_renderer,Mat4::IDENTITY,
false);

       _eventDispatcher->dispatchEvent(_eventAfterVisit);

    }

 

    //绘制信息提示层

    if (_notificationNode)

    {

       _notificationNode->visit(_renderer,Mat4::IDENTITY,
false);

    }

 

    //左下角显示FPS等信息

    if (_displayStats)

    {

       showStats();

    }

}

_runningScene->visit(_renderer,Mat4::IDENTITY, false);函数先按照子节点的zOrder排序并递归渲染之,然后再调用自己的draw函数,最终完成该帧的渲染任务
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cocos-2dx 帧循环