Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

cocos2d-x game crashes when entered background

my cocos2d-x game crashes when entering background. here is some code from AppDelegate:

// This function will be called when the app is inactive. When comes a phone call,it's be invoked too
void AppDelegate::applicationDidEnterBackground()
{

    CCDirector::sharedDirector()->pause();

    CCUserDefault::sharedUserDefault()->flush();

    CocosDenshion::SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();

}

// this function will be called when the app is active again
void AppDelegate::applicationWillEnterForeground()
{


    CCDirector::sharedDirector()->resume();

    CocosDenshion::SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
}

and the error message:

libGPUSupportMercury.dylib`gpus_ReturnNotPermittedKillClient:
0x3797e094:  trap   
0x3797e096:  nop    

note that it always crashes for iPhone, but 99% crashes on Android (okay when the game haven't load large images etc)

EDIT: I've tried CCDirector::sharedDirector()->stopAnimation() and it works great for iOS. But still crashes for Android (not immediately. when returning back to the app, the screen become black (but i think it is still running because background music is still playing. then about 5 seconds later it crashes)

EDIT 2: The error message in Eclipse:

libEGL   call to OpenGL ES API with no current context (logged once per thread)      (red warning text)

libc     Fatal signal 11 (SIGSEGV) at 0x5f012000 (code=2)                  (black text)
like image 219
OMGPOP Avatar asked Jun 13 '12 04:06

OMGPOP


1 Answers

The app delegate method applicationDidEnterBackground: is called after your application transitions to the background, but before your application is suspended. Unfortunately, you may not perform any GPU instructions while in the background, or the watchdog will terminate you (as you're seeing here).

Assuming that your CCDirector::sharedDirector()->pause() call is responsible for stoping your graphics/animation loop, you should move that to the applicationWillResignActive: delegate method. That method is called before your application transitions to the background.

However you have your code structured, make sure your animation loop is completely flushed and stopped before you return from the applicationWillResignActive: delegate call.

Note: This answer is in reference to why it always crashes on iOS

like image 95
Jason Coco Avatar answered Oct 06 '22 22:10

Jason Coco