2015-01-29 2 views
0

Я отлаживаю игру с Android-картой cocos2d-x. Он должен взаимодействовать с библиотекой сторонней организации, которая предоставляет некоторую общую услугу, например, вход в систему. В библиотеке будет отображаться полупрозрачный значок на моей игровой поверхности.'surfaceDestroyed callback +' without 'surfaceDestroyed callback -'

Тогда что-то не так произойдет, когда я прикоснусь к домашней кнопке в игре обратно на рабочий стол. И если я снова коснусь значка игры, появится последний снимок игры, но с ним нельзя будет взаимодействовать.

Обычно, когда я минимизировать игру, LogCat затмение будет печатать, как показано ниже:

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) 

Но ненормально, то LogCat как ниже:

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

У меня есть причина проблемы.

Библиотека сторонних разработчиков реализована асинхронно, для чего требуется функция обратного вызова для каждого интерфейса приложения. Я называю его интерфейс из основного потока android (также называемого потоком пользовательского интерфейса), но функция обратного вызова выполняется в другом потоке вместо основного потока. Поэтому я не могу делать UI-функции в функции обратного вызова.

Чтобы узнать, что вызов библиотеки завершен и изменить пользовательский интерфейс игры, я установил переменную флага перед вызовом интерфейса библиотеки и изменением переменной в функции обратного вызова. Затем запустите цикл while (1), проверяя переменную флага до ее изменения.

Вы заметили, что основной поток, из которого я вызываю интерфейс библиотеки, был заблокирован после вызова интерфейса. Вот почему это вызывает проблему.

Чтобы решить эту проблему, я использую таймер для просмотра переменной флага вместо цикла while (1).

Тогда я решил позволить этой вещи идти в этот момент. Но детали, подобные тому, как поверхность создается и уничтожается в рамках cocos2d-x, по-прежнему остаются для меня изучением. :)