2013-04-23 6 views
5

Próbuję zaangażować się w ramy OpenGL Libgdx. Użyłem LwjglApplication do tworzenia prostych aplikacji do renderowania pudełek, niektórych siatek i niektórych tekstur. Natknąłem się na aplikację Aurelien Ribon, która tworzy sztywne ciała Box2D. Użył LwjglCanvas do integracji z Java Swing. Próbowałem zrobić to sam, stworzyłem JFrame, a następnie dodałem LwjglCanvas. Następnie ustaw domyślną operację JFrame na blisko EXIT_ON_CLOSE.Co oznacza "AL lib: alc_cleanup: 1 urządzenie nie zamknięte"?

Jednak za każdym razem zamknąć aplikację, to logi na konsolę:

AL lib: alc_cleanup: 1 device not closed.

Nie wiem, co to znaczy i nie wyrządza mi to żadnej szkody. Chcę tylko wiedzieć, co to znaczy. Według 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.

Gdzie należy wiązać LwjglCanvas.stop(), należy dodać go do kolejki EventDispatchThread lub powinny wiążę go do JFrame.addWindowListener?

Co naprawdę oznacza "AL lib: alc_cleanup: 1 device not closed"?

Wielkie dzięki!

Odpowiedz

4

AL lib jest "biblioteką audio" używaną przez Libgdx (jeden z wariantów OpenAL).

Wierzę, że ten komunikat oznacza po prostu, że biblioteka audio usuwa niektóre (w twoim przypadku tylko jeden) strumienie audio/uchwyty dla ciebie. Jeśli zobaczysz to przy wyjściu, jego nieszkodliwe, ponieważ wszystkie zasoby zostaną wyczyszczone przez system operacyjny.

W przypadku wewnętrznego oczyszczenia dźwięku przed jego wyjściem wiadomość powinna zniknąć.

Aby uzyskać więcej informacji, poszukaj alc_cleanup tu: http://repo.or.cz/w/openal-soft.git/blob/HEAD:/Alc/ALc.c

+0

Rozumiem. Tak więc wiadomość nie ma nic wspólnego z wątkiem wysyłki zdarzeń w Java Swing. Dlaczego komunikat nie jest obecny podczas zamykania aplikacji LibgdxApplication? – nagloan

+0

Być może 'alc_cleanup' nie jest wywoływany w niektórych ścieżkach wyjścia aplikacji (np. Jeśli wywołane zostanie' System.exit() ',' alc_cleanup' nie zostanie wywołane. –

+0

Dzięki za wyjaśnienie i za odniesienie do kodu. dla mnie – nagloan

6

Należy starać zawsze zamykając swoją aplikację z kawałkiem kodu poniżej:

Gdx.app.exit(); 

I zazwyczaj umieścić go w moim pauzy () Metoda, ponieważ nie było powodu, aby moja aplikacja działała w tle.

Ta statyczna metoda informuje strukturę, że aplikacja planuje zamknięcie i w ten sposób uwolni wszystkie zasoby. Błąd, który otrzymujesz, ponieważ interfejs JNI załadował bibliotekę OpenAL, ale system jest zamknięty, zanim biblioteka zostanie poprawnie rozładowana i zwolniona. Miałem ten sam problem co ty, ale to rozwiązało. Jak podano w JavaDoc, metoda exit():

Zaplanuj [s] wyjście z aplikacji. Na Androidzie spowoduje to wywołanie pauzy() i dispose() jakiś czas w przyszłości, to nie będzie od razu zakończyć aplikację.

+0

Dzięki! Działa dobrze! –

8

AL.destroy(); musi zostać wywołana przed zamknięciem aplikacji. to połączenie jest zwykle zawarte w bloku finally, ale jeśli aplikacja wywołuje System.exit (0), ostatecznie bloki nie są już wykonywane.