本文转自: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是一个开源的游戏开发框架,广泛用于2D游戏、实时渲染应用程序和其他互动内容的制作。这个压缩包“cocos2d-x-3.1.zip”包含了Cocos2d-x框架的3.1版本,这是一个经典且相对旧的版本,可能对于那些寻找历史...
Cocos2d-x提供了一个SpineNode类,它是Cocos2d-x的CCNode的子类,可以直接在场景中添加和管理Spine动画。通过Lua绑定,你可以轻松地调用Spine的API来播放、停止、暂停或重置动画,以及改变动画的速度、时间缩放等...
本教程将深入探讨如何在Cocos2d-x中实现场景切换,并通过提供的"SimpleGame源代码"进行实例解析。 首先,我们需要理解Cocos2d-x中的`Director`类是管理场景的核心组件。`Director`负责创建、显示和切换场景。在...
《cocos2d-x 2.1.4:探索移动游戏开发的新篇章》 cocos2d-x 是一个跨平台的2D游戏开发框架,它为开发者提供了强大的工具和技术支持,使得游戏开发变得更为便捷。2.1.4 版本是这个框架的一个重要里程碑,它在前一...
通过学习cocos2d-x的API文档,可以快速上手创建游戏场景、添加交互元素、编写游戏逻辑。同时,利用其提供的工具如cocos console、cocos creator等,可以进行项目构建、调试和资源管理。 五、未来展望 随着cocos2d-x...
《cocos2d-x 跑酷源码详解:打造属于你的移动跑酷游戏》 在移动游戏开发领域,cocos2d-x是一款广受欢迎的开源2D游戏引擎,它基于C++,支持iOS、Android以及其他多种平台。本文将深入探讨如何利用cocos2d-x开发一款...
### 三、cocos2d-x应用场景 cocos2d-x适用于各种类型的2D游戏开发,无论是简单的休闲游戏还是复杂的角色扮演游戏都能很好地应对。此外,它还可以用于教育软件、互动媒体等领域。 ### 四、学习资源推荐 对于想要...
首先,Cocos2d-x的场景管理是游戏开发的基础。在《迷失航线》中,游戏会通过Scene对象来组织不同的游戏阶段,如主菜单、游戏关卡、游戏结束画面等。每个Scene都是一个独立的舞台,可以包含多个Layer,Layer则负责...
【cocos2d-x 游戏小demo】是一款基于cocos2d-x框架开发的简易游戏示例,主要展示了如何运用这个强大的2D游戏引擎来创建一个基础的魔塔类游戏。cocos2d-x是一个跨平台的游戏开发库,支持iOS、Android、Windows等多...
1. **游戏场景管理**:Cocos2d-x使用Scene对象来表示游戏的不同阶段,例如主菜单、游戏进行中、游戏结束等。在贪吃蛇游戏中,每个场景都有其特定的逻辑和显示内容,通过Director类的replaceScene或pushScene方法实现...
1. **场景(Scene)和层(Layer)管理**:cocos2d-x使用场景和层的概念来组织游戏逻辑。场景是一个大的容器,可以包含多个层,层则负责具体的交互逻辑和显示元素。 2. **动作(Actions)**:cocos2d-x提供了丰富的...
1. **初始化与场景管理**:Cocos2d-x 使用Scene对象来表示游戏中的不同阶段或关卡。每个Scene由多个Layer组成,Layer负责处理特定的游戏逻辑或UI元素。在Demo中,可能会有初始化Scene的代码,展示了如何创建和切换...
1. 场景管理:Cocos2d-X中的Scene代表游戏的各个阶段或屏幕,开发者可以通过Director类来切换不同的场景,实现游戏流程的控制。 2. 动作与动画系统:Cocos2d-X提供了丰富的动作类,如移动、旋转、缩放和淡入淡出等...
cocos2d-x的核心组件包括场景(Scene)、层(Layer)、精灵(Sprite)、动作(Action)和转换(Transition)等。这些组件共同构建了游戏的逻辑和视觉效果。场景是游戏的顶层容器,可以包含多个层;层则负责组织游戏的对象和...
1. 场景(Scene):在Cocos2d-lua中,每个游戏状态或屏幕对应一个场景,场景之间可以互相切换。 2. 层(Layer):场景由多个层组成,层是显示内容的基本单元,可以包含精灵、文本、菜单等元素。 3. 精灵(Sprite):...
2. **图形界面**:cocos2d-x提供了丰富的图形绘制API,包括精灵(Sprite)、层(Layer)、场景(Scene)等。在这个项目中,开发者会创建方块的精灵图片,设置合适的坐标和大小,实现游戏界面的布局。 3. **事件处理...
《Cocos2d-x游戏引擎实战开发炸弹超人》是一个基于Cocos2d-x框架的2D游戏开发教程,旨在帮助开发者深入理解并熟练运用这一强大的游戏引擎。Cocos2d-x是一个开源、跨平台的2D游戏开发工具,它支持iOS、Android、...
cocos2d-x的核心功能包括精灵(Sprite)管理、场景(Scene)切换、动作(Action)设计、物理引擎支持、粒子系统、触摸事件处理、动画制作、定时器及调度、UI组件以及音频播放等。 在《Cocos2D-x权威指南》这本书中...
1. **场景(Scene)与层(Layer)**:cocos2d-x中的游戏逻辑主要通过场景和层来组织。场景是游戏的一个独立单元,比如游戏的主菜单、游戏关卡等。层则是场景中的组件,负责特定功能,如背景、角色、UI等。在源代码中...