zoukankan      html  css  js  c++  java
  • Cocos2d-x3.2游戏的核心循环在Application,怎样处理FPS不稳

    今天天气非常阴,立即要下雨了,陈吃早点功夫写点东西,

    一场秋雨一场寒,十场秋雨要穿棉,各位从今往后多穿点

    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;

    }

  • 相关阅读:
    Canvas与Image互相转换示例以及利用该技术实现微信长按自动识别二维码功能
    chrome浏览器无法安装非应用商店插件的解决办法
    用canvas绘制android机器人
    TortoiseGit保存用户名和密码的方法
    event对象的兼容性
    利用jQuery无缝滚动插件liMarquee实现图片(链接)和文字(链接)向右无缝滚动(兼容ie7+)
    jQuery动画的hover连续触发动画bug处理
    用jquery实现平滑的页面滚动效果
    实现段落文字两端对齐的css样式
    前端构建工具gulpjs的使用介绍及技巧(转)
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4028142.html
Copyright © 2011-2022 走看看