android系統下,切入後台,則紋理全部失效,從後台切到前台,cocos2d-x會重新加載紋理。這樣有兩個問題:
1、如果紋理較多的話,加載紋理會卡很長時間,就像死機一樣。 變通解決方法是修改引擎代碼,增加一個進度條提示。
2、文字描邊等用到RenderTexture的地方會出現異常紋理,文字會花掉。 暫時不知道原因,無解。
這裡提供一個解決方案,解決掉紋理失效的問題,初步測試沒有發現大的問題,但是具體還要看實際運行情況,畢竟android機器太多了。
1、Cocos2dXGLSurfaceView.java代碼修改
[cpp]
@Override
public void onPause() {
this.queueEvent(new Runnable() {
@Override
public void run() {
Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleOnPause();
}
});
// super.onPause();
}
2、main.cpp中修改
[cpp]
void Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit(JNIEnv* env, jobject thiz, jint w, jint h)
{
InitCrashReport();
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();
// }
}
SurfaceView的onPause會使紋理失效,這裡屏蔽掉onPause則後台和前台切換不會使紋理失效,短時間內運行正常,具體掛幾個小時還是否正常就不確定了。 這樣就無需重新加載紋理了,也就不會出現從後台到前台出現的卡屏的情況。
注意,由於不調用onPause了,所以切到後台的時候,渲染循環和聲音都沒有停止,這裡需要做下修改,切到後台的時候停止播放聲音,停止渲染操作,並且每幀sleep(50)防止後台運行時太過耗電。