• replaceScene、pushScene、popScene区别


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

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

    因为pushScene并不会销毁前一个scene,仅仅是将后一个scene按照堆栈的方式加入到前一个scene的上面。如果自身代码中内存管理写的不好的,利用pushScene很难发现该方面的问题,一旦崩溃定位都很难定位。replaceScene可以及早的将隐含的问题给暴露出来。
     
    2. 尽量不要在onEnter里面初始化精灵Sprite
    这个就和上一条有点关系了,如果使用了pushScene,那么再popScene的时候是不会调用前一个场景的init方法的,所以有同学就喜欢把一些初始化放在onEnter里面,具体为什么不好,我们来看一下不同切换场景的时候,每个Scene的生命周期就知道了。
    假设scene A是活动场景,现在我们用scene B来pushScene替换A,A和B的生命周期是这样的:
    B ---- init();
    A ---- onExit();
    B ---- onEnter();
    B ---- onEnterTransitionDidFinish();
     
    此时popScene,弹出scene B,函数调用如下:
    B ---- onExit();
    B ---- 析构函数被调用
    A ---- onEnter();
     
    从上面可以看出以下几点,
    1. A的析构函数始终未被调用,因此A一直在内存中。
    2. 先执行B的init()函数,之后才调用A的onExit()方法,再之后才调用B的onEnter();所以初始化最好应该放在init中来初始化。在上一个场景退出之前初始化好后一个场景需要的资源。
     
    同样的,我们再来看一下replaceScene切换场景,scene的生命周期
    假设scene A是活动场景,现在我们用scene B来replaceScene替换A,A和B的生命周期是这样的:
    B ---- init();
    A ---- onExit();
    A ---- 析构函数被调用
    B ---- onEnter();
    B ---- onEnterTransitionDidFinish();
     
    此时B replace A回来的调用跟上面一样,如下:
    A ---- init();
    B ---- onExit();
    B ---- 析构函数调用
    A ---- onEnter();
  • 相关阅读:
    基于ARM的指纹采集仪的设计与实现
    基于单片机和CPLD的数字频率计的设计
    转来的
    单片机式语音播报伏特表
    汽车驾驶模拟器单片机系统设计
    基于AT89C51的智能矿井环境质量监控系统
    我的理解OpenAPI原理
    关联规则中的支持度与置信度
    LVS-NAT实现负载均衡
    在IIS上部署Analysis Services
  • 原文地址:https://www.cnblogs.com/xiajianwei/p/5159605.html
Copyright © 2020-2023  润新知