2010-06-24 8 views
15

Sto scrivendo un gioco graficamente intenso per il Nexus One, utilizzando NDK (revisione 4) e OpenGL ES 2.0. Stiamo davvero spingendo l'hardware qui, e per la maggior parte funziona bene, tranne che ogni tanto ho un grave incidente con questo messaggio di log:Nexus One/Android "CPU può essere cavigliato" bug

W/SharedBufferStack (398): WAITFORCONDITION (LockCondition) scaduto (identità = 9, stato = 0). La CPU può essere cavigliata. riprovare.

L'intero sistema si blocca, ripete più volte questo messaggio e si riavvierà dopo un paio di minuti o dobbiamo riavviarlo manualmente. Stiamo utilizzando Android OS 2.1, aggiornamento 1.

So che alcune altre persone hanno visto questo bug, a volte in relazione all'audio. Nel mio caso è causato dallo SharedBufferStack, quindi suppongo che si tratti di un problema OpenGL. Qualcuno ha incontrato questo, e ancora meglio risolto? O qualcuno sa cosa sta succedendo con lo SharedBufferStack per aiutarmi a restringere le cose?

+0

Per caso si vede "FAILED BINDER TRANSACTION" nell'output logcat? – fadden

+0

Ho avuto lo stesso problema due mesi fa e ho trovato un modo per aggirarlo (non proprio una correzione), ma ho dimenticato dove stava accadendo. Stavo cercando sul Web, quindi dovrebbe esserci almeno una soluzione/soluzione alternativa disponibile. – Shade

+0

@Shade: ricordi qualcosa sulla soluzione alternativa? – ognian

risposta

2

Non credo che questo errore possa verificarsi nel codice audio, SharedBufferStack viene utilizzato solo nelle librerie di Surface. Molto probabilmente si tratta di un bug nell'implementazione di EGL swapBuffers o SurfaceFlinger e dovresti archiviarlo su bug tracker.

+0

Dai un'occhiata al link TheCodeArtist pubblicato, e vedrai che questo errore può accadere nel codice audio. –

1

waitForCondition() causa il blocco (sistema di blocco).
Ma non è la causa principale. Questo sembra essere un problema con

Il audio-quadro (ur gioco ha suoni?)
oppure
Il GL di rendering-sottosistema.

Qualsiasi messaggio "CPU-pegged" nel registro? Si potrebbe voler dare un'occhiata a questo:
http://soledadpenades.com/2009/08/25/is-the-cpu-pegged-and-friends/

+0

Il collegamento parla di AudioTrack. Tuttavia, il mio problema deriva da MediaPlayer. –

1

ho avuto CPU may be pegged messaggi sul LogCat perché ho avuto un ArrayBlockingQueue nel mio codice. Se si dispone di una coda di blocco (come sembra essere il caso con i buffer audio), assicurarsi di BlockingQueue.put() solo se si dispone del controllo del tempo sufficiente per gli elementi correttamente BlockingQueue.take() per fare spazio. Oppure, dai un'occhiata all'utilizzo di BlockingQueue.offer().

0

FWIW, mi ha colpito questo problema di recente, mentre lo sviluppo su Android 2.3.4 utilizzando GL ES 2 su un Samsung Galaxy S.

Il problema per me è stato un bug nei miei glDrawArrays chiamare - sono stato il rendering oltre la fine del buffer, cioè il "conteggio" che stavo passando era maggiore del conteggio effettivo. È interessante notare che la chiamata non ha generato un'eccezione, ma causerebbe in modo intermittente il problema che hai descritto. Inoltre, il buffer che ho finito per il rendering sembrava sbagliato, quindi sapevo che qualcosa non andava.La cosa "CPU potrebbe essere cavigliata" rendeva ancora più fastidioso rintracciare il vero problema.