2015-01-29 4 views
0

cocos2d-x 프레임 워크로 안드로이드 게임을 디버깅하고 있습니다. 사용자 로그인과 같은 일반적인 서비스를 제공하는 제 3 자 라이브러리와 상호 작용해야합니다. 라이브러리는 게임 화면에 반투명 아이콘을 그립니다.'surfaceDestroyed 콜백 +' 'surfaceDestroyed 콜백 없음 -'

그런데 게임의 홈 버튼을 데스크톱으로 다시 터치하면 문제가 발생합니다. 게임 아이콘을 다시 터치하면 게임의 마지막 스냅 샷이 표시되지만 상호 작용할 수는 없습니다.

, 나는 게임을 최소화 할 때, 일식의 로그 캣이 울부 짖는 소리로 인쇄됩니다

일반적으로 :

01-29 09:13:21.493: D/SdkActivity(21533): ==onPause== 
01-29 09:13:21.494: D/ActivityThread(21533): ACT-AM_ON_PAUSE_CALLED ActivityRecord{4227d568 [email protected] {org.cocos2dx.simplegame.uc/cn.uc.gamesdk.SdkActivity}} 
01-29 09:13:21.504: D/ActivityThread(21533): ACT-PAUSE_ACTIVITY handled : 1/[email protected] 
01-29 09:13:21.506: V/PhoneWindow(21533): DecorView setVisiblity: visibility = 4 ,Parent =ViewRoot{41eb1ab8 org.cocos2dx.simplegame.uc/org.cocos2dx.simplegame.uc.SimpleGame,ident = 0}, this =com.android.internal.policy.impl.PhoneWindow$DecorView{41da5790 I.E..... R....... 0,0-720,1280} 
01-29 09:13:21.506: D/ActivityThread(21533): ACT-HIDE_WINDOW handled : 0/[email protected] 
01-29 09:13:21.521: I/SurfaceView(21533): updateWindow -- onWindowVisibilityChanged, visibility = 4 
01-29 09:13:21.521: I/SurfaceView(21533): Changes: creating=false format=false size=false visible=true left=false top=false mUpdateWindowNeeded=false mReportDrawNeeded=false redrawNeeded=false forceSizeChanged=false mVisible=true mRequestedVisible=false 
01-29 09:13:21.521: I/SurfaceView(21533): Cur surface: Surface(name=null)/@0x41da3990 
01-29 09:13:21.526: I/SurfaceView(21533): New surface: Surface(name=null)/@0x41da3a60, vis=false, frame=Rect(0, 0 - 720, 1280) 
01-29 09:13:21.526: I/SurfaceView(21533): Callback --> surfaceDestroyed 
01-29 09:13:21.526: I/SurfaceView(21533): surfaceDestroyed callback + 
01-29 09:13:21.526: I/SurfaceView(21533): surfaceDestroyed callback - 
01-29 09:13:21.527: V/SurfaceView(21533): Layout: x=0 y=0 w=720 h=1280, frame=Rect(0, 0 - 720, 1280) 
01-29 09:13:21.530: D/GraphicBuffer(21533): create handle(0x5de3b2c8) (w:720, h:1280, f:1) 
01-29 09:13:21.532: D/OpenGLRenderer(21533): Flushing caches (mode 0) 
01-29 09:13:21.532: D/GraphicBuffer(21533): close handle(0x626af840) (w:720 h:1280 f:1) 
01-29 09:13:21.533: D/GraphicBuffer(21533): close handle(0x61ed99d8) (w:720 h:1280 f:1) 
01-29 09:13:21.533: D/GraphicBuffer(21533): close handle(0x5de3b2c8) (w:720 h:1280 f:1) 
01-29 09:13:21.542: I/SurfaceView(21533): updateWindow -- OnPreDrawListener, mHaveFrame = true 
01-29 09:13:21.698: D/OpenGLRenderer(21533): Flushing caches (mode 0) 
01-29 09:13:21.699: D/GraphicBuffer(21533): close handle(0x62879c20) (w:720 h:1280 f:1) 
01-29 09:13:21.700: D/GraphicBuffer(21533): close handle(0x66fc8b40) (w:720 h:1280 f:1) 
01-29 09:13:21.701: D/GraphicBuffer(21533): close handle(0x632cfc78) (w:720 h:1280 f:1) 
01-29 09:13:21.702: D/GraphicBuffer(21533): close handle(0x632cff80) (w:720 h:1280 f:1) 
01-29 09:13:21.718: W/IInputConnectionWrapper(21533): showStatusIcon on inactive InputConnection 
01-29 09:13:21.731: I/SurfaceView(21533): updateWindow -- onWindowVisibilityChanged, visibility = 8 
01-29 09:13:21.732: D/OpenGLRenderer(21533): Flushing caches (mode 0) 
01-29 09:13:21.736: I/SurfaceView(21533): updateWindow -- OnPreDrawListener, mHaveFrame = true 
01-29 09:13:21.737: D/OpenGLRenderer(21533): Flushing caches (mode 0) 
... 
01-29 09:13:22.162: I/SurfaceView(21533): updateWindow -- OnPreDrawListener, mHaveFrame = true 
01-29 09:13:22.162: D/SdkActivity(21533): ==onSaveInstanceState== 
01-29 09:13:22.163: D/SdkActivity(21533): ==onStop== 
01-29 09:13:22.166: V/PhoneWindow(21533): DecorView setVisiblity: visibility = 4 ,Parent =ViewRoot{41d393e8 org.cocos2dx.simplegame.uc/cn.uc.gamesdk.SdkActivity,ident = 12}, this =com.android.internal.policy.impl.PhoneWindow$DecorView{421b4c40 I.E..... R....... 0,0-720,1280} 
01-29 09:13:22.166: D/ActivityThread(21533): ACT-STOP_ACTIVITY_HIDE handled : 0/[email protected] 
01-29 09:13:22.178: D/OpenGLRenderer(21533): Flushing caches (mode 0) 

그러나 비정상적으로는 로그 캣은 울부 짖는 소리입니다 :

01-29 09:11:27.378: D/SdkActivity(21256): ==onSaveInstanceState== 
01-29 09:11:27.378: D/SdkActivity(21256): ==onPause== 
01-29 09:11:27.378: D/ActivityThread(21256): ACT-AM_ON_PAUSE_CALLED ActivityRecord{42028fb0 [email protected] {com.mf.sglm.uc/cn.uc.gamesdk.SdkActivity}} 
01-29 09:11:27.390: D/ActivityThread(21256): ACT-PAUSE_ACTIVITY handled : 1/[email protected] 
01-29 09:11:27.391: V/PhoneWindow(21256): DecorView setVisiblity: visibility = 4 ,Parent =ViewRoot{41eacbd8 com.mf.sglm.uc/com.mf.sglm.uc.SGLM,ident = 0}, this =com.android.internal.policy.impl.PhoneWindow$DecorView{41da0858 I.E..... R.....I. 0,0-720,1280} 
01-29 09:11:27.392: D/ActivityThread(21256): ACT-HIDE_WINDOW handled : 0/[email protected] 
01-29 09:11:27.394: I/SurfaceView(21256): updateWindow -- onWindowVisibilityChanged, visibility = 4 
01-29 09:11:27.394: I/SurfaceView(21256): Changes: creating=false format=false size=false visible=true left=false top=false mUpdateWindowNeeded=false mReportDrawNeeded=false redrawNeeded=false forceSizeChanged=false mVisible=true mRequestedVisible=false 
01-29 09:11:27.394: I/SurfaceView(21256): Cur surface: Surface(name=null)/@0x41d9e8a0 
01-29 09:11:27.399: I/SurfaceView(21256): New surface: Surface(name=null)/@0x41d9e970, vis=false, frame=Rect(0, 0 - 720, 1280) 
01-29 09:11:27.399: I/SurfaceView(21256): Callback --> surfaceDestroyed 
01-29 09:11:27.399: I/SurfaceView(21256): surfaceDestroyed callback + 

그것은 보인다 'surfaceDestroyed 콜백 +' 및 'surfaceDestroyed callback-'는 몇 가지 예입니다. 하지만 그들 중 하나가 그리워 할 때 나는 틀린 것을 발견 할 수 없다 ...

답변

0

나는 그 문제의 이유를 얻었다.

타사의 라이브러리는 비동기 적으로 구현되며 각 응용 프로그램 인터페이스에 대해 콜백 함수가 필요합니다. 안드로이드 메인 스레드 (UI 스레드라고도 함)에서 인터페이스를 호출하지만 콜백 함수는 주 스레드 대신 다른 스레드에서 실행됩니다. 그래서 콜백 함수에서 UI를 할 수 없습니다.

라이브러리 호출이 완료되었고 게임 UI가 변경되었음을 알기 위해 라이브러리 인터페이스를 호출하고 콜백 함수에서 변수를 변경하기 전에 플래그 변수를 설정했습니다. 그런 다음 플래그 변수가 변경 될 때까지 'while (1)'루프를 시작하여 플래그 변수를 확인하십시오.

인터페이스 호출 후에 내가 라이브러리의 인터페이스라고 부르는 주 스레드가 차단되었음을 알게되었습니다. 그것이 문제의 원인입니다.

문제를 해결하기 위해 타이머를 사용하여 'while (1)'루프 대신 flag 변수를 봅니다.

그런 다음이 순간에이 문제를 해결하기로했습니다. 그러나 cocos2d-x 프레임 워크에서 표면을 생성하고 파괴하는 방법과 같은 세부 사항은 여전히 ​​나를 위해 공부해야합니다. :)