私はLibgdxOpenGLフレームワークに参加しようとしています。 LwjglApplication
を使用して、ボックス、メッシュ、テクスチャをレンダリングする簡単なアプリを作成しました。硬いBox2Dボディを作成するAurelienRibonのアプリに出会いました。彼はLwjglCanvas
を使用してJavaのSwingと統合しました。自分で作ってみました。JFrame
を作成してから、LwjglCanvas
を追加しました。次に、JFrame
のデフォルト操作を_EXIT_ON_CLOSE
_の近くに設定します。
ただし、アプリケーションを閉じるたびに、コンソールにログが記録されます。
_AL lib: alc_cleanup: 1 device not closed
_。
それが何を意味するのかわかりませんし、害はありません。それが何を意味するのか知りたいだけです。 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.
LwjglCanvas.stop()
をどこにバインドする必要がありますか、それをEventDispatchThread
キューに追加する必要がありますか、それとも_JFrame.addWindowListener
_にバインドする必要がありますか?
そして、「AL lib:alc_cleanup:1つのデバイスが閉じられていない」とはどういう意味ですか?
どうもありがとう!
AL libは、Libgdx(OpenALバリアントの1つ)によって使用される「オーディオライブラリ」です。
このメッセージは、オーディオライブラリがいくつかの(あなたの場合は1つだけの)オーディオストリーム/ハンドルをクリーンアップしていることを意味していると思います。終了時にこれが表示された場合、すべてのリソースがOSによってクリーンアップされるため、無害です。
終了する前にオーディオを内部的にクリーンアップすると、メッセージは消えます。
詳細については、ここでalc_cleanup
を探してください: http://repo.or.cz/w/openal-soft.git/blob/HEAD:/Alc/ALc.c
AL.destroy();
は、アプリケーションをシャットダウンする前に呼び出す必要があります。この呼び出しは通常finallyブロックに含まれますが、アプリケーションがSystem.exit(0)
を呼び出すと、finallyブロックは実行されなくなります。
以下のコードを使用して、常にアプリを閉じてみてください。
Gdx.app.exit();
アプリをバックグラウンドで実行する理由がなかったため、通常はpause()メソッドに配置します。
この静的メソッドは、アプリケーションが終了を計画していることをフレームワークに通知するため、すべてのリソースを効果的に解放します。発生するエラーは、JNIインターフェースがOpenALライブラリーをロードしたが、そのライブラリーが適切にアンロードおよび解放される前にシステムが閉じられたためです。私はあなたと同じ問題を抱えていましたが、これで解決しました。 JavaDocで述べられているように、exit()メソッドは次のとおりです。
アプリケーションからの終了をスケジュールします。 Androidでは、これによりpause()およびdispose()が呼び出されますが、アプリケーションはすぐには終了しません。