cocos2d提供了比较重要的有3种暂停、恢复的机制
分别是CCDirector, CCActionManager, CCScheduler提供的
1 CCDirecotor:
-(void) pause;
-(void) resume;
导演类的暂停恢复是针对整个运行场景的,所以如果我们还想在暂停的画面上做其他事情,不推荐这种方法
2 CCActionManager
-(void) pauseTarget:(id)target;
-(void) resumeTarget:(id)target;
动作管理器暂停恢复特定的动作,当然也可以一次性暂停恢复所有的。
3 CCScheduler
-(void) pauseTarget:(id)target;
-(void) resumeTarget:(id)target;
定时器暂停恢复特定的目标,一般指数据更新,
这里详细介绍CCDirecotor的暂停恢复。
CCDirecotor::pause()内容如下:
void CCDirector::pause(void) { if (m_bPaused) { return; } m_dOldAnimationInterval = m_dAnimationInterval; // when paused, don't consume CPU setAnimationInterval(1 / 4.0); m_bPaused = true; }可见,这里把帧频降到4帧,而且把 m_bPaused = true;这个标志会在 drawScene()中判断是否需要更新定时器数据。
// Draw the Scene void CCDirector::drawScene(void) { // calculate "global" dt calculateDeltaTime(); //tick before glClear: issue #533 if (! m_bPaused) { m_pScheduler->update(m_fDeltaTime); }
从上面代码可以看出,暂停后 m_pScheduler就不在更新数据了,但是还是会draw场景的;glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* to avoid flickr, nextScene MUST be here: after tick and before draw. XXX: Which bug is this one. It seems that it can't be reproduced with v0.9 */ if (m_pNextScene) { setNextScene(); } kmGLPushMatrix(); // draw the scene if (m_pRunningScene) { m_pRunningScene->visit(); } // draw the notifications node if (m_pNotificationNode) { m_pNotificationNode->visit(); } if (m_bDisplayStats) { showStats(); } kmGLPopMatrix(); m_uTotalFrames++; // swap buffers if (m_pobOpenGLView) { m_pobOpenGLView->swapBuffers(); } if (m_bDisplayStats) { calculateMPF(); }}
另外,如果在andriod上从后台切换回来游戏出现黑屏时,有如下解决方案
需要修改三个文件:
1) cocos2dx/platform/CCPlatformMacros.h
将Line84修改为 #define CC_ENABLE_CACHE_TEXTURE_DATA 0
2)cocos2dx/platform/android/java/src/org/cocos2dx/lib/Cocos2dxGLSurfaceView.java
注释掉Line167。
3)android工程目录下jin/hellocpp/main.cpp
注释掉Line32~43。
基本原理就是在activity进入后台后,不清除texture缓存,这样在activity回到前台后,不需要重新load资源。
我在自己的游戏上试了一把,修改之前切回游戏需要4秒左右时间,修改后不用1秒,可谓瞬间完成。
不过这个解决方案有些小问题,当有其他surfaceView的activity,比如集成了Admob广告后,切回来时只能看到广告,而不显示游戏画面。有个老外Pablo Tonello回复帖子说没有集成Admob也遇到了这种情况。目前还不知道是啥问题,有待慢慢研究。