• Cocos2d-x Scene生命周期 pushScene和replaceScene


    最近在开发过程中遇到很多切换场景的时候概率性崩溃,内存暴增的问题。因此总结一些开发中需要注意的要点,

    1. 切换全屏场景的时候最好使用replaceScene而不是pushScene

    因为pushScene并不会销毁前一个scene,仅仅是将后一个scene按照堆栈的方式加入到前一个scene的上面。如果自身代码中内存管理写的不好的,利用pushScene很难发现该方面的问题,一旦崩溃定位都很难定位。replaceScene可以及早的将隐含的问题给暴露出来。

     

    2. 尽量不要在onEnter里面初始化精灵Sprite

    这个就和上一条有点关系了,如果使用了pushScene,那么再popScene的时候是不会调用前一个场景的init方法的,所以有同学就喜欢把一些初始化放在onEnter里面,具体为什么不好,我们来看一下不同切换场景的时候,每个Scene的生命周期就知道了。

    假设scene A是活动场景,现在我们用scene BpushScene替换AAB的生命周期是这样的:

    B ---- init();

    A ---- onExit();

    B ---- onEnter();

    B ---- onEnterTransitionDidFinish();

     

    此时popScene,弹出scene B,函数调用如下:

    B ---- onExit();

    B ---- 析构函数被调用

    A ---- onEnter();

     

    从上面可以看出以下几点,

    1. A的析构函数始终未被调用,因此A一直在内存中。

    2. 先执行Binit()函数,之后才调用AonExit()方法,再之后才调用BonEnter();所以初始化最好应该放在init中来初始化。在上一个场景退出之前初始化好后一个场景需要的资源。

     

    同样的,我们再来看一下replaceScene切换场景,scene的生命周期:

    假设scene A是活动场景,现在我们用scene BreplaceScene替换AAB的生命周期是这样的:

    B ---- init();

    A ---- onExit();

    A ---- 析构函数被调用

    B ---- onEnter();

    B ---- onEnterTransitionDidFinish();

     

    此时B replace A回来的调用跟上面一样,如下:

    A ---- init();

    B ---- onExit();

    B ---- 析构函数调用

    A ---- onEnter();

     

    3. 一些基本的

     

    CCDirector:  导演,负责场景的切换以及场景的信息。如宽度,高度,旋转场景内容。

    CCScene:     场景场景包含有布景,精灵,每场戏的不同,要切换场景。游戏中可分为主界面, 游戏, 分数榜,结束界面等。

    CCLayer:     布景类似是层的概念,也可来源于PS的层的概念。每一层都带有众多精灵等

    CCSprite:    精灵。就是演员的,演员就需要加入到层里面去的。有相应的动作。

    CCAction:    动作。精灵的动作。

     

    scene(即 CCScene)app 工作流上独立块。scene也叫做 screents 或者“stages一个app可能拥有多个scenes, 但在任何时候只能有一个是激活状态的。

    一个cocos2d CCScene 对象 由一个或多个layers组成(layerCCLayer 对象)layers之间是前后相连的。layer提供了scene的外观 appearance和行为behavior;通常的用法是直接用一个或多个layers实例化一个scence; CCScene的子类CCTrasitionScene 实现移动transitions , 提供两个scenes 之间的转移效果((比如fade out/in, slide from a side, 等效果).)由于scenes CCNode子类,所以scenes可以手工或者用actions来转变坐标。

     

     
  • 相关阅读:
    facebook's HipHop for PHP: Move Fast
    使用Linux(CentOS)搭建SVN服务器全攻略
    PHP内置的预定义常量大全
    用PHP纯手工打造会动的多帧GIF图片验证码
    PHP的unset究竟会不会释放内存?
    请远离include_once和require_once
    真希望能夠統一一下接口
    Linux下同步网络时间
    mongo 报connect@src/mongo/shell/mongo.js:251:13错误的解决方式
    spring Aop实现防止重复提交
  • 原文地址:https://www.cnblogs.com/DswCnblog/p/3663423.html
Copyright © 2020-2023  润新知