cocos2d-x 帧循环不严谨造成场景切换卡顿

  最近在用cocos2d-x做引导界面,2dx版本是2.2.3,场景切换加上了效果,所有资源都已经使用texturepacker打包预加载,但是在实际运行调试中,场景切换相当卡顿。

  各种纠结后,无意中将帧率打印(setDisplayStats(true))放出来,发现一个严重的问题,对象数量一直在增加,导致帧率不断下降,等到场景切换时,已经完全跑不动了。仔细查看代码之后发现,我在场景帧循环(update())里面有监控手机网络状态,并且根据网络状态需要移除一些精灵,然后创建一些精灵并显示出来,问题就在这里。

void SkyGuideSecondPage::update(float delta)
{
    char wlan_state[16] = {0};
    property_get("coocaa.wlan_state", wlan_state, "0");int wlanstate = atoi(this->guideinfo.wlan_state);

    if (wlanstate == 1)
    {
  this->removeChildByTag(214);
       CCSprite *sp_connecting = CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("guide_connecting_ttf"));
       sp_connecting->setAnchorPoint(ccp(0, 1));
       sp_connecting->setPosition(ccp(1640, 1750));
       sp_connecting->setScale(1.5f);
       this->addChild(sp_connecting);
    //如果wlanstate在某一时刻开始等于1了,那么将会从这一帧起,每一帧创建一个sp_connecting精灵,一秒帧循环40次,那么每秒就创建了40个相同的精灵,哗啦啦的各种消耗上来了,再场景切换,肯定卡了,所以在这里需要加一个状态判断,保证sp_connecting只创建一次就好了。
}

修改后的代码:

void SkyGuideSecondPage::update(float delta)
{
    char wlan_state[16] = {0};
    property_get("coocaa.wlan_state", wlan_state, "0");
    int wlanstate = atoi(this->guideinfo.wlan_state);

    if (wlanstate == 1)
    {
        if (this->connectflag == 0)//初始状态为0,状态判断
        {
            this->connectflag = 1;//将状态置1,这样下一帧就进不来了,精灵sp_connecting就不会再次被创建了
            this->removeChildByTag(214);
            CCSprite *sp_connecting = CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("connecting"));
            sp_connecting->setAnchorPoint(ccp(0, 1));
            sp_connecting->setPosition(ccp(500, 400));
            sp_connecting->setScale(1.5f);
            this->addChild(sp_connecting);
        }
}
时间: 2024-10-23 06:57:04

cocos2d-x 帧循环不严谨造成场景切换卡顿的相关文章

4.帧循环(游戏循环),schedule

 1 概述 游戏乃至图形界面的本质是不断地画图,然而画图并非任意的,不论什么游戏都须要遵循一定的规则来呈现出来,这些规则就体现为游戏逻辑.游戏逻辑会控制游戏内容,使其依据用户输入和时间流逝而改变.因此.游戏能够抽象为不断地反复. 2 下面动作: A 处理用户输入 B 处理定时事件 C 画图 游戏主循环就是这种一个循环,它会重复运行以上动作,保持游戏进行下去.直到玩家退出游戏. CCDirector::mainLoop()方法,这种方法负责调动定时器,画图,发送全局通知,并处理内存回收池.该方

4.帧循环(游戏主循环),schedule

 1 概述 游戏乃至图形界面的本质是不断地绘图,然而绘图并不是随意的,任何游戏都需要遵循一定的规则来呈现出来,这些规则就体现为游戏逻辑.游戏逻辑会控制游戏内容,使其根据用户输入和时间流逝而改变.因此,游戏可以抽象为不断地重复. 2 以下动作: A 处理用户输入 B 处理定时事件 C 绘图 游戏主循环就是这样的一个循环,它会反复执行以上动作,保持游戏进行下去,直到玩家退出游戏. CCDirector::mainLoop()方法,这个方法负责调动定时器,绘图,发送全局通知,并处理内存回收池.该方

cocos2dx中帧循环的伪代码实现

1.在游戏开发中,帧率很大程度上体现了游戏的流畅度,帧循环是游戏中一个很重要的概念 2.下面用伪代码实现了cocos2dx中的帧循环 /*main函数调用*/ CCApplication::sharedApplication()->run(); /*游戏真正的入口,完成精灵的布置和场景的初始化*/ applicationDidFinishLaunching(); /*帧循环开始*/ while (1) { CCDirector::sharedDirector()->mainLoop(); /*

我的Cocos2d-x学习笔记(九)游戏帧循环(游戏主循环)

游戏运行时候会不断按照游戏逻辑规则重新绘图,反复处理用户输入.处理定时事件.绘图,直到游戏结束. Cocos2d-x引擎也是通过不断绘图来进行游戏的,默认的帧率在AppDelegate.cpp中显示为60帧每秒,也就是每秒执行了60次用户输入.定时时间.绘图等. 抄录Cocos2d-x高级教程中内容如下: 游戏乃至图形界面的本质是不断地绘图,然而绘图并不是随意的,任何游戏都需要遵循一定的规则来呈现出来,这些规则就体现为游戏逻辑. 游戏逻辑会控制游戏内容,使其根据用户输入和时间流逝而改变.因此,游

quick cocos2d x场景切换的生命周期函数调用学习

先上一个场景的基本模版: 1 local ModelScene = class("ModelScene", function() 2 return display.newScene("ModelScene") 3 end) 4 5 function ModelScene:ctor() 6 self.sceneName = "ModelScene" 7 -- 注册点击事件监听 8 self.layer = display.newLayer() 9

【Cocos2D学习】Cocos2d-x之CCScene场景切换效果的使用

我们要怎样切入游戏场景呢?其实就会要用到CCScene场景切换的知识,然后场景的切换效果,也即是场景的一种过渡效果...   Cocos2d-x提供了很多场景间切换的效果,可以方便大家使用 过渡类: //用CCTransition绕y轴翻转x轴过渡到FilipXpScene CCDirector::sharedDirector()->replaceScene( CCTransitionFlipX::create(2, pScene) ); CCTransitionFlipX::create(&quo

8 cocos2dx添加场景切换效果,控制场景切换彻底完成之后再执行动画

 1 添加场景切换效果 供场景切换的类: CCTransitionJumpZoom CCTransitionProgressRadialCCW CCTransitionProgressRadialCW CCTransitionProgressHorizontal CCTransitionProgressVertical CCTransitionProgressInOut CCTransitionProgressOutIn CCTransitionCrossFade CCTransitionF

Cocos2d-X3.0 刨根问底(九)----- 场景切换(TransitionScene)源代码分析

上一章我们分析了Scene与Layer相关类的源代码,对Cocos2d-x的场景有了初步了解,这章我们来分析一下场景变换TransitionScene源代码. 直接看TransitionScene的定义 class CC_DLL TransitionScene : public Scene { public: /** Orientation Type used by some transitions */ enum class Orientation { /// An horizontal or

Cocos2d-X3.0 刨根问底(九)----- 场景切换(TransitionScene)源码分析

上一章我们分析了Scene与Layer相关类的源码,对Cocos2d-x的场景有了初步了解,这章我们来分析一下场景变换TransitionScene源码. 直接看TransitionScene的定义 class CC_DLL TransitionScene : public Scene { public: /** Orientation Type used by some transitions */ enum class Orientation { /// An horizontal orie