2015-04-07 9 views
5

Quando metto in pausa/riattiva la mia app veramente veloce poi ho il seguente problema:Crash con SurfaceView in Android NDK nei momenti di pausa/riprendere app veloce

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 abbastanza sicuro che sto fermando/iniziare il mio render filo correttamente e questo problema si verifica solo quando sospetto/riprendo l'applicazione molto velocemente (come quando schiaccia il pulsante delle app aperte).

Qualche idea quale potrebbe essere la causa di eglCreateWindowSurface che restituisce EGL_NO_SURFACE qui? La mia ipotesi sarebbe che abbia a che fare con qualcosa ancora connesso a SurfaceView.

+0

Il testo incluso mostra perché si blocca, ma non dove. Puoi includere anche l'eccezione? Forse rilevante: https://source.android.com/devices/graphics/architecture.html#activity – fadden

+0

Beh, si blocca nel metodo eglCreateWindowSurface che restituisce EGL_NO_SURFACE –

+0

Esiste un dump di arresto anomalo nativo con una traccia dello stack? Il codice EGL e BufferQueue non dovrebbe causare il crash dell'applicazione quando si trova in uno stato sbagliato. – fadden

risposta

6

Sembra che tu stia cercando di creare un EGLSurface per una superficie che ne ha già uno. Se la velocità è un problema, di solito è a causa del ritardo nella gestione della callback di Surface: Surface Surface viene parzialmente gestito da Window Manager, che richiede la comunicazione tra processi.

Forse il codice nativo ha ancora un handle per il vecchio SurfaceHolder e se si spostava più lentamente l'handle sarebbe stato sostituito da un imminente surfaceCreated()? È difficile dire senza sapere esattamente cosa fa il tuo codice. Un modo per affrontare questo tipo di problemi è aggiungere il logging a tutti i punti di cambio di stato interessanti e confrontare i log da pause/resume "slow" e pause/resume "fast".

Dovrebbe essere possibile evitare queste situazioni gestendo attentamente lo stato di SurfaceView. This appendix per il documento arch arch parla della differenza tra i cicli di vita di Activity e SurfaceView e due modi per strutturare un'app per evitare problemi.