Cocos2d-x3.2游戏的核心循环在Application,如何处理FPS不稳------沈大海

时间:2022-06-01 19:45:35

int Application::run()

{

    if(!applicationDidFinishLaunching())

    {

        return 1;

    }

    

    long lastTime = 0L;

    long curTime = 0L;

    

    auto director = Director::getInstance();

    auto glview = director->getOpenGLView();

    

    // Retain glview to avoid glview being released in the while loop

    glview->retain();

    //看到了吗,其实所有游戏就在这个循环中

    while (!glview->windowShouldClose())   //如果没退出,比如用户按下了home 就退出了

    {

        lastTime = getCurrentMillSecond();  //获取当前系统时间

        director->mainLoop();                          //1.处理游戏绘图和游戏逻辑

        glview->pollEvents();                           //2.处理游戏交互

                                                                                                                 

        curTime = getCurrentMillSecond();   //3.以上1.2必定要消耗一定的时间而且动画和怪物越多可能耗时越大所以curTime - lastTime就是这次计算消耗的时间

        if (curTime - lastTime < _animationInterval//如果curTime - lastTime < _animationInterval 

                                                                                          //说明在60/1秒内完成了这一帧的计算再让cup sleep FPS剩下时间来保证帧率的稳定

        {

            usleep(static_cast<useconds_t>((_animationInterval - curTime + lastTime)*1000));

        }

       /////////如果想知道游戏中是否有不稳定如何呢? 加入如下代码

      else

     {

        //........

     }

    }

/////////////////你明白了吗 亲

    /* Only work on Desktop

    *  Director::mainLoop is really one frame logic

    *  when we want to close the window, we should call Director::end();

    *  then call Director::mainLoop to do release of internal resources

    */

    if (glview->isOpenGLReady())

    {

        director->end();

        director->mainLoop();

    }

    

    glview->release();

    

    return 0;

}


void Application::setAnimationInterval(double interval)

{

    _animationInterval = interval*1000.0f;

}