web-dev-qa-db-ja.com

「ALlib:alc_cleanup:1つのデバイスが閉じられていない」とはどういう意味ですか?

私は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つのデバイスが閉じられていない」とはどういう意味ですか?

どうもありがとう!

6
nagloan

AL libは、Libgdx(OpenALバリアントの1つ)によって使用される「オーディオライブラリ」です。

このメッセージは、オーディオライブラリがいくつかの(あなたの場合は1つだけの)オーディオストリーム/ハンドルをクリーンアップしていることを意味していると思います。終了時にこれが表示された場合、すべてのリソースがOSによってクリーンアップされるため、無害です。

終了する前にオーディオを内部的にクリーンアップすると、メッセージは消えます。

詳細については、ここでalc_cleanupを探してください: http://repo.or.cz/w/openal-soft.git/blob/HEAD:/Alc/ALc.c

5
P.T.

AL.destroy();は、アプリケーションをシャットダウンする前に呼び出す必要があります。この呼び出しは通常finallyブロックに含まれますが、アプリケーションがSystem.exit(0)を呼び出すと、finallyブロックは実行されなくなります。

10
benez

以下のコードを使用して、常にアプリを閉じてみてください。

Gdx.app.exit();

アプリをバックグラウンドで実行する理由がなかったため、通常はpause()メソッドに配置します。

この静的メソッドは、アプリケーションが終了を計画していることをフレームワークに通知するため、すべてのリソースを効果的に解放します。発生するエラーは、JNIインターフェースがOpenALライブラリーをロードしたが、そのライブラリーが適切にアンロードおよび解放される前にシステムが閉じられたためです。私はあなたと同じ問題を抱えていましたが、これで解決しました。 JavaDocで述べられているように、exit()メソッドは次のとおりです。

アプリケーションからの終了をスケジュールします。 Androidでは、これによりpause()およびdispose()が呼び出されますが、アプリケーションはすぐには終了しません。

8
Isosymmetric