2013-04-23 11 views
5

Sto provando a impegnarmi nel framework OpenGL di Libgdx. Ho usato LwjglApplication per creare alcune semplici app che eseguono il rendering di riquadri, alcune mesh e alcune trame. Ho trovato l'app di Aurelien Ribon che crea corpi rigidi di Box2D. Ha utilizzato lo LwjglCanvas per l'integrazione con Java's Swing. Ho provato a crearne uno, ho creato uno JFrame e ho aggiunto LwjglCanvas. Quindi imposta l'operazione di default dello JFrame su EXIT_ON_CLOSE.Che cosa significa "AL lib: alc_cleanup: 1 dispositivo non chiuso"?

Tuttavia ogni volta che chiudo l'applicazione, questa registra al mio console:

AL lib: alc_cleanup: 1 device not closed.

Non so cosa significhi e non mi fa alcun danno. Voglio solo sapere cosa significa. Secondo LwjglCanvas docs:

All OpenGL calls are done on the EDT. This is slightly less efficient then a dedicated thread, but greatly simplifies synchronization. Note that you may need to call stop() or a Swing application may deadlock on System.exit due to how LWJGL and/or Swing deal with shutdown hooks.

Dove devo associare il LwjglCanvas.stop(), devo aggiungere alla coda di EventDispatchThread o dovrei associarlo al JFrame.addWindowListener?

E cosa significa "AL lib: alc_cleanup: 1 dispositivo non chiuso"?

Grazie mille!

risposta

4

Il lib di AL è la "libreria audio" utilizzata da Libgdx (una delle varianti di OpenAL).

Credo che questo messaggio significhi solo che la libreria audio sta pulendo alcuni (nel tuo caso uno solo) flussi audio/maniglie per te. Se si vede questo all'uscita, è innocuo in quanto tutte le risorse verranno ripulite dal sistema operativo.

Se si esegue la pulizia interna dell'audio prima di uscire, il messaggio dovrebbe scomparire.

Per maggiori dettagli, cercare alc_cleanup qui: http://repo.or.cz/w/openal-soft.git/blob/HEAD:/Alc/ALc.c

+0

Vedo. Quindi il messaggio non ha nulla a che fare con il thread di invio dell'evento in Java Swing. Come mai il messaggio non è presente quando si chiude la LibgdxApplication? – nagloan

+0

Forse 'alc_cleanup' non viene invocato in alcuni percorsi di uscita dell'app (ad esempio, se viene invocato' System.exit() ', non verrà richiamato' alc_cleanup'. –

+0

Grazie per la chiarificazione e per il codice di riferimento. per me. – nagloan

6

Si dovrebbe cercare sempre la chiusura tua app con il pezzo di codice qui sotto:

Gdx.app.exit(); 

Io di solito mettere nel mio pausa () Metodo, perché non c'era motivo per la mia app di funzionare in background.

Questo metodo statico indica al framework che l'applicazione sta pianificando per la chiusura e quindi rilascerà tutte le risorse in modo efficace. L'errore che si ottiene è dovuto al fatto che l'interfaccia JNI ha caricato una libreria OpenAL, ma il sistema viene chiuso prima che la libreria venga correttamente scaricata e rilasciata. Ho avuto lo stesso problema di te, ma questo lo ha risolto. Come indicato in JavaDoc, il metodo exit():

Pianifica [s] un'uscita dall'applicazione. Su Android, ciò causerà una chiamata a pause() e dispose() in futuro, non terminerà immediatamente l'applicazione.

+0

Grazie! Funziona benissimo! –

8

AL.destroy(); deve essere chiamato prima che l'applicazione si chiuda. questa chiamata è normalmente inclusa in un blocco finally, ma se l'applicazione chiama System.exit (0), infine i blocchi non vengono più eseguiti.