cocos2dx - replaceScene、pushScene、popScene的区别

本文详细解析了游戏开发中场景切换的两种方式:replaceScene和pushScene。通过对比两者在场景生命周期上的区别,强调了replaceScene能更好地暴露内存管理问题,而pushScene则可能留下场景未完全销毁的隐患。适合游戏开发者深入理解场景管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

 

2. 创建和释放Scene的生命周期

如果使用了pushScene,那么再popScene的时候是不会调用前一个场景的init方法的,每个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();

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值