2015-04-07 5 views
5

Wenn ich Pause/meine App wirklich schnell unpause dann bekomme ich folgendes Problem:Absturz mit Surface in Android NDK, wenn Pause/Fortsetzen App schnell

E/BufferQueueProducer( 177): [SurfaceView] connect(P): already connected (cur=1 req=1) 
E/libEGL (25863): eglCreateWindowSurface: native_window_api_connect (win=0xb4984508) failed (0xffffffea) (already connected to another API?) 
E/libEGL (25863): eglCreateWindowSurface:416 error 3003 (EGL_BAD_ALLOC) 

Im ziemlich sicher, dass ich zu stoppen/Start-Thread meines machen richtig und dieses Problem tritt wirklich nur auf, wenn ich die App wirklich schnell pausiere bzw. wieder aktiviere (zB wenn du den Open-Apps-Button machst).

Irgendwelche Ideen was die Ursache für eglCreateWindowSurface sein könnte, die EGL_NO_SURFACE hier zurückbringt? Ich vermute, dass es etwas damit zu tun hat, dass noch etwas mit dem SurfaceView verbunden ist.

+0

Ihr beiliegender Text zeigt, warum es abstürzt, aber nicht wo. Kannst du die Ausnahme auch einschließen? Möglicherweise relevant: https://source.android.com/devices/graphics/architecture.html#activity – fadden

+0

Gut stürzt es in der eglCreateWindowSurface-Methode ab, die EGL_NO_SURFACE –

+0

zurückgibt Gibt es einen nativen Absturzspeicherabzug mit einer Stapelüberwachung? Der EGL- und BufferQueue-Code sollte die App nicht abstürzen lassen, wenn sie sich im falschen Status befindet. – fadden

Antwort

6

Es klingt, als ob Sie eine EGL-Oberfläche für eine Oberfläche erstellen möchten, die bereits über eine solche verfügt. Wenn die Geschwindigkeit ein Problem ist, liegt das meist an der Verzögerung der Surface-Callback-Verarbeitung - die SurfaceView-Oberfläche wird teilweise vom Window Manager verarbeitet, was eine Kommunikation zwischen Prozessen erfordert.

Vielleicht hat Ihr systemeigener Code immer noch ein Handle mit dem alten SurfaceHolder, und wenn Sie sich langsamer bewegten, würde der Handle durch eine kommende surfaceCreated() ersetzt werden? Es ist schwer zu sagen, ohne genau zu wissen, was dein Code tut. Eine Möglichkeit, diese Art von Problemen zu lösen, besteht darin, an allen interessanten Statusänderungspunkten Protokollierung hinzuzufügen und die Protokolle von "langsamer" Pause/Wiederaufnahme und "schneller" Pause/Wiederaufnahme zu vergleichen.

Es sollte möglich sein, diese Situationen zu vermeiden, indem Sie den SurfaceView-Zustand sorgfältig verwalten. This appendix an den Graphics Arch Doc spricht über den Unterschied zwischen den Activity und SurfaceView Lebenszyklen und zwei Möglichkeiten, eine App zu strukturieren, um Probleme zu vermeiden.