BLOG main image

분류 전체보기 (321)
free (36)
영화 (85)
드라마 (21)
게임 (28)
만화/책 (34)
개발 (46)
IT (68)
연예 (3)
Visitors up to today!
Today hit, Yesterday hit
TETRIS
rss
2013. 6. 11. 13:50

앱을 실행해서 작동하다가, 홈 버튼을 누르거나 전화가 오는 등의 이유로 백그라운드로 전환 되었을 때 다시 앱으로 돌아오고 나서 스프라이트가 검정색으로 나오는 현상이 일어났다. 


이 문제는 cocos2d-x 의 예전 버전을 사용할 때는 없었던 현상인데, 2.1.3 으로 업그레이드 한 후에 발생하기 시작했다. 하지만 예전 버전에서도 같은 현상이 일어난다는 얘기도 있다.


void AppDelegate::applicationWillEnterForeground()

{

 //CCDirector::sharedDirector()->stopAnimation(); 

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

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

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

}


Foreground 로 복귀했을 때 AppDelegate 의 applicationWillEnterForeground 메서드는 정상 호출되고, 음악도 플레이가 다시 시작되는 것으로 보아 이쪽의 문제는 아니었다.


위의 주석 부분에 해당 되는 내용을 추가하면 된다는 조언도 있었으나 아무 소용 없었다.


이 현상이 발생한 후로는 LogCat 에 아래와 같은 로그가 남기 시작하는데,


D/cocos2d-x debug info(13584): OpenGL error 0x0502 in /SomeFolder/cocos/x2.1.3/cocos2d-2.1rc0-x-2.1.3/SomeAppName/proj.android/../../cocos2dx/sprite_nodes/CCSprite.cpp draw 589

D/cocos2d-x debug info(13584): OpenGL error 0x0501 in /SomeFolder/cocos/x2.1.3/cocos2d-2.1rc0-x-2.1.3/SomeAppName/proj.android/../../cocos2dx/sprite_nodes/CCSprite.cpp draw 589

D/cocos2d-x debug info(13584): OpenGL error 0x0502 in /SomeFolder/cocos/x2.1.3/cocos2d-2.1rc0-x-2.1.3/SomeAppName/proj.android/../../cocos2dx/sprite_nodes/CCSprite.cpp draw 589


딱 봐도 OpenGL 관련해서 Sprite 처리에 문제가 생겼음을 알 수 있다.

알수는 있다... 해결을 못해서 그렇지... 

당연히 cocos2d 엔진 만든 놈들이 해결해야지...?


다행이도, 해결 방법은 있었다.


우선, cocos2dx 의 header 파일 하나를 수정한다.


cocos2dx/platform/CCPlatformMacros.h

[84] #define CC_ENABLE_CACHE_TEXTURE_DATA 1


그리고, 아래 파일의 주석을 제거한다.

/proj.android/jni/hellocpp/main.cpp 


void Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit(JNIEnv*  env, jobject thiz, jint w, jint h)

{

    if (!CCDirector::sharedDirector()->getOpenGLView())

    {

        CCEGLView *view = CCEGLView::sharedOpenGLView();

        view->setFrameSize(w, h);


        AppDelegate *pAppDelegate = new AppDelegate();

        CCApplication::sharedApplication()->run();

    }

    else

    {

        ccDrawInit();

        ccGLInvalidateStateCache();

        

        CCShaderCache::sharedShaderCache()->reloadDefaultShaders();

        CCTextureCache::reloadAllTextures();

        CCNotificationCenter::sharedNotificationCenter()->postNotification(EVNET_COME_TO_FOREGROUND, NULL);

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

    }

}


코드만 봐도 reloadAllTextures() ... 뭔가 될 것 같은 느낌이 팍 온다 (...)


이걸 해주고 리빌드를 해주면, 정상적으로 작동!


그 동안 홈 버튼 누르고 나갔다가 들어왔을 때 앱이 안되서 정말 짜증났었는데, 이렇게 해결하면 됨.