`

cocos2d-x 场景切换

阅读更多
本文转自:http://blog.sina.com.cn/s/blog_c5102aa30101js0o.html

目前的理解。。不对的地方希望大家指正。

以后实践中再体会。。。。。。。。。。。

场景切换是最容易出问题的地方。

网上有种说法是:

场景切换时在旧场景中把新场景需要的图片资源先加载到全局的纹理缓存区。加载时在旧的场景上显示进度条。加载完毕进入新场景。



(以下是对比在旧场景中加载新场景图片资源和在新场景自己中加载图片资源区别。)

场景A,新图片(全局缓存区)+LOADINGSCENE+场景B

场景A+LOADINGSCENE+场景B+新图片(全局缓存区)。

稍微有些差别。

结合使用中间场景我想这样做会更好点。



中间场景一个就够了。他就一个枚举值标识目标场景。最好不要让他干别的。本来就不想它占太多内存。



场景切换时,使用LAODINSCENE这个中间场景。新的场景中的INIT方法去加载本场景需要的一些图片资源到全局的纹理缓存区。加载时用一个层显示进度条。图片全部加载完毕,移除这个显示进度条的层。然后创建其他需要的层。如果其他层很耗内存的话还可以延时个一两帧(或者在上一个场景的析构函数调用完之后新场景的onenter,onenterdidfinish中去做其他的。)。用了中间场景之后。应该就没必要了。。



实践中得到的结果是:

@1:不加切换效果时:

B->gouzao

B->init  如果场景中各层节点及其子节点很占内存,那么可以几帧之后再创建其他层。

Init中加载一些必要的东西。

A->onExit

A->xigou

B->onEnter  在这里创建其他层也挺靠谱。因为场景A已经析构了。

B->onEnterTransitionDidFinish

@2:加切换效果时:切换效果不是中间场景。

B->gouzao

B->init

B->onEnter

即便等待几帧再去创建场景的层,还是会在这个位置。依然在A场景析构前。尽量不用过渡效果。B场景的update调用了好几次了,A场景才调用自己的onExit。。。

A->onExit

B->onEnterTranstionDidFinish

A->xigou

做一个笔记。。以后遇到场景切换时出问题。可以从这些方法的调用顺序中去找解决办法。



缓存释放

如果游戏有很多场景,在切换场景的时候可以把前一个场景的内存全部释放,防止总内存过高.

场景自己的内存不用担心。但是场景需要用到的加载在全局纹理缓存区的内存需要去管理。

CCTextureCache::sharedTextureCache()->removeAllTextures(); 释放到目前为止所有加载的图片

CCTextureCache::sharedTextureCache()->removeUnusedTextures(); 将引用计数为1的图片释放掉

即这个纹理没有场景使用他,只有全局的纹理缓存retain了一份。

Removes unused textures Textures that have a retain count of 1 will be deleted It is convenient to call this method after when starting a new Scene.

VS监控内存使用率???这个环境不熟。。以后再做实验。

CCTextureCache::sharedTextureCache()->removeTexture(); 单独释放某个图片

void removeTextureForKey(const char * textureKeyName)?????key是什么??

CCSpriteFrameCache(从精灵表plist文件加载) 与 CCTextureCache 释放的方法差不多。

值得注意的是释放的时机,一般在切换场景的时候释放资源,如果从A场景切换到B场景,调用的函数顺序为B::init()---->A::exit()---->B::onEnter() 可如果使用了切换效果,比如CCTransitionJumpZoom::transitionWithDuration这样的函数,则函数的调用顺序变为B::init()---->B::onEnter()---->A::exit() 而且第二种方式会有一瞬间将两个场景的资源叠加在一起,如果不采取过度,很可能会因为内存吃紧而崩溃。(返回到上面,A场景析构之后,使用removeUnusedTextures())。

有时强制释放全部资源时,会使某个正在执行的动画失去引用而弹出异常,可以调用CCActionManager::sharedManager()->removeAllActions();来解决。

先留着。。



Push,pop

Push新场景进去后,旧的场景的UPDATE停止调用。新场景被POP之后,旧场景的UPDATE恢复继续调用。内存中的相关成员变量值不变。

被POP的场景会从内存释放。。。。先调用ONEXIT。再调用析构函数。。。





onEnter,onExit这些函数在重写他们时必须调用父类实现。









1.   CCTextureCache::sharedTextureCache()->addImageAsync("img/bg.png", this, callfuncO_selector(HelloWorld::loadingCallBack)); 

2.          CCTextureCache::sharedTextureCache()->addImageAsync("img/01.png", this, callfuncO_selector(HelloWorld::loadingCallBack)); 

3.  CCSprite *s1 = CCSprite::create("img/01.png"); 

4.      CCSprite *s2 = CCSprite::create("img/02.png"); 

这样,创建精灵时不会再去加载了吧?前面场景切换时先加载一些必要的图片资源到全局的缓存区。用时,不用加载,减少IO消耗。







cocos2d-x场景切换时内存过高导致crash 解决方法

http://blog.csdn.net/zhangjingyangguang/article/details/7618048

这个帖子是别人的一些经验总结。以后实践中如果出了什么问题可以参考。
分享到:
评论

相关推荐

    cocos2d-x场景切换源代码

    cocos2d-x场景切换源代码,http://blog.csdn.net/danming60520/article/details/8924192

    cocos2d-x学习笔记(5)-- CCScene场景的切换(带过度效果).rar

    cocos2d-x学习笔记(5)-- CCScene场景的切换(带过度效果).rar

    cocos2d-x场景的创建于切换

    cocos2d-x场景的创建和切换,使用vs2010编译

    Cocos2D-x游戏开发之场景切换

    Cocos2D-x游戏开发之场景切换 CCDirector::sharedDirector()->replaceScene(SScene scene); CCDirector::sharedDirector()->PushScene(SScene scene);

    反转贪吃蛇 Cocos2d-x+lua贪食蛇游戏源码

    使用cocos2d-x lua和code ide编写的贪吃蛇小游戏 反转贪食蛇一改传统贪食蛇的玩法,游戏大屏幕一分为二。半屏采用传统贪食蛇玩法,半屏加入反转元素,触屏即向相反方向转头! 除此之外,还新增多种规则,等着...

    Cocos2D-X2.2.3学习笔记18(场景切换)

    Cocos2D-X2.2.3学习笔记18(场景切换)http://blog.csdn.net/hucblog/article/category/2242181

    Cocos2d x实例 场景切换

    通过这个例子可以学到了很多有关场景、布景层、精灵、菜单、标签、场景切换动画等很多知识。

    cocos2d-x实例——场景自动切换

    场景自动切换采用回调函数动作实现,不用动画亦可实现简易的动画效果,根据场景切换动画的不同,切换效果可多变。

    cocos2d-x-sneaky-joystick:适用于cocos2d-x> = 3.7的运动型操纵杆的更新版本

    这是Cocos2d-x> = 3.7的端口如何使用图书馆使用该库的最佳方法是创建一个JoystickLayer,然后将该层添加到您的游戏场景中。 这是有关如何创建操纵杆拇指的示例# include " SneakyInput.h "// ...auto screenSize = ...

    Cocos2d-x UI开发之场景切换代码实例

    主要介绍了Cocos2d-x UI开发之场景切换代码实例,cocos2d-x中的场景切换是通过导演类调用相应的方法完成的,本文通过代码和详细注释来说明,需要的朋友可以参考下

    CocoStudio 0.2.4.1

    CocoStudio是一套基于Cocos2D-X引擎的工具集,包括UI编辑器、动画编辑器、场景编辑器和数据编辑器四个工具。 UI编辑器,主要是便于编辑UI,支持碎图合并,自定义UI; 动画编辑器,可以合并碎图,导入Flash,设置...

    CocoStudio V 0.1.7

    更新场景编辑器,适配新版cocos2d-x 2.1.4,支持cocos2d-x全部组件。 增加:场景编辑器解析 JsonReader。 增加:加载场景例子。 UI编辑器: 将UI,场景,动画三个编辑器的打开路径使用不同节点保存在配置文件中;...

    CocosApp07-场景切换.zip

    场景切换: 某个场景替换当前场景,原先场景就被释放掉了。还有动画切换、压栈出栈切换。把新的场景压入栈中,并作为当前场景

    SBSkeleton:cocos2d v3.x 的游戏模板

    #SBSkeleton ###cocos2d v3.x 的游戏骨架 SB Skeleton 是 cocos2d v3.x 和 SpriteBuilder 的简单准系统模板,包含制作简单游戏的骨架。 ##概述 它包含 5 个场景,都是不言自明的: 主场景 游戏场景 游戏结束 ...

    MagicTools引擎(d3d与opengles渲染器,集成cocos2d)

    MagicTools引擎,包括3d场景,材质,d3d与opengles两个渲染器,max导出插件,集成了cocos2d作为ui。 引擎架构如下: 1.MtFoundation:底层数学库、字符串处理、操作系统和编译器宏定义等底层封装库。这些功能放在了...

    9-4回调加动作

    1.实现带一个参数或者两个...3.实现场景的切换(中间要有过渡场景,以便实现前一个场景资源的释放)。 4.实现label的循环旋转+不停的来回移动。 博客参考:http://blog.csdn.net/dingxiaowei2013/article/details/11116155

Global site tag (gtag.js) - Google Analytics