cocos2dx 中切换场景内存占用过高的处理

  次阅读 作者:智能小宝 来源:互联网 2015-09-28 15:39 我要评论(0)

cocos2dx 中切换场景内存占用过高的处理

1、运行场景:

CCScene *pScene = HelloWorld::scene();

pDirector->runWithScene(pScene);

2、替换场景:

(1)

CCScene *pScene=SceneTestScene::scene();

CCDirector::sharedDirector()->replaceScene(pScene);

(2) CCScene *pScene=SceneTestScene::scene();

CCDirector::sharedDirector()->pushScene(pScene);

(3) CCScene *pScene=SceneTestScene::scene();

CCDirector::sharedDirector()->popScene(pScene);

3具体的代码执行流程

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

B ---- init();

A ---- onExit();

B ---- onEnter();

B ---- onEnterTransitionDidFinish();

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

B ---- onExit();

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

A ---- onEnter(); (并不会执行sceneA的init函数 ,因为 pushScene的时候会执行sceneA的onExit函数释放一些资源, 当pup的时候,不会执行init函数加载需要的资源,出现为止的错误)

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

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();

4具体的引擎的执行代码, 查看对象的生命周期。见下面的链接 http://blog.csdn.net/tonny_guan/article/details/28121973

-----------------华丽的分割线---------------- 当使用replaceScene切换场景的时候,在游戏所占有的内存是当前内存峰值时多少哪,很可怕的 时当前场景的内存值,加上下一个场景的资源所占用的内存值。 原因。。。。 在每个场景里面会有一个init函数,一个onEnterTransitionDidFinish函数,一个Onexit函数,init实现一些初始化工作,onEnterTransitionDidFinish在init之后执行,Onexit在场景退出时回收init时分配的资源。在调试时发现一个很有趣的现象,那就是从场景一切换到场景二时,在切换的一瞬间会内存会非常高,但是过了一段时间后,内存会回到一个平稳的状态,譬如切换时内存会达到80M,切换过后内存会降到50M。分析原因,怀疑是上一个场景的内存还没有释放,然后这一个场景的内存已经分配,所以两个叠加在一起,就比较高了。所以我便在第一个场景的Onexit函数中加一个断点,在第二个场景的init和onEnterTransitionDidFinish函数中各加一个断点,然后运行程序,发现程序先到第二个场景的init中,然后再回到第一个场景的Onexit中,最后才到第二个场景的onEnterTransitionDidFinish中。我才恍然大悟,原来在场景切换时,不是马上会执行第一个场景的Onexit函数,而是先到第二个场景的init中加载资源,然后回到第一个场景中释放资源,最后才是到onEnterTransitionDidFinish中。 内存中的峰值很惊人。

方案一, 将必要的资源放在onEnter 中处理,其他的资源 放在onEnterTransitionDidFinish处理。 方案二 , 给场景切换添加一个过度场景,现在主流的rpg ,或者横版格斗的游戏都已经这样处理。 因为资源量比较大,这样处理高效并且安全

本站文章信息来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • 未来两年人工智能要怎么走?看这篇就够了

    未来两年人工智能要怎么走?看这篇就够了

  • 无人驾驶汽车如何改变城市生活?听听他们怎么说

    无人驾驶汽车如何改变城市生活?听听他们怎么说

  • 英国研发“杀生”机器人 通过生命体获取能量

    英国研发“杀生”机器人 通过生命体获取能量

  • 韩春雨称已能重复实验结果 近期将有消息公布

    韩春雨称已能重复实验结果 近期将有消息公布

网友点评网友点评
阅读推荐阅读推荐

据国外媒体报道,在过去两年内,聊天机器人(chatbot)、人工智能以及机器学习的研发和采用取得了巨大进展。许多初创公司正利用人工智能和...

霍金 视觉中国 图 英国著名物理学家霍金(Stephen Hawking)再次就人工智能(AI)发声,他认为:对于人类来说,强大AI的出现可能是最美妙的...

文|郑娟娟 今年,人工智能(AI) 60岁了。在AI60岁的时候,笔者想要介绍一下AI100,一个刚刚2岁的研究项目,但它的预设寿命是100年,甚至更长...

AlphaGo与李世石的人机大战,为大众迅速普及了人工智能的概念。 但对谷歌而言,除了下围棋,现在的人工智能进展到哪一步了?未来,人工智能...