“AL lib:alc_cleanup:1设备未关闭”是什么意思?

我正试图让自己参与Libgdx OpenGL框架。 我已经使用LwjglApplication来创建一些简单的应用程序来渲染框,一些网格和一些纹理。 我遇到了Aurelien Ribon的应用程序,它创建了刚性的Box2D机身。 他使用LwjglCanvas与Java的Swing集成。 我自己尝试制作一个JFrame然后添加了LwjglCanvas 。 然后将JFrame的默认操作设置为接近EXIT_ON_CLOSE

但是,每次关闭应用程序时,都会记录到我的控制台:

AL lib: alc_cleanup: 1 device not closed

我不知道这意味着什么,这对我没有任何伤害。 我只是想知道这意味着什么。 根据LwjglCanvas文档:

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变体之一)使用的“音频库”。

我相信这条消息只是意味着音频库正在清理一些(在您的情况下只有一个)音频流/句柄。 如果您在退出时看到此信息,则无害,因为操作系统将清除所有资源。

如果您在退出之前在内部清理音频,则消息应该消失。

有关更多详细信息,请在此处查找alc_cleanup : http : alc_cleanup : alc_cleanup

AL.destroy(); 必须在应用程序关闭之前调用。 此调用通常包含在finally块中,但如果应用程序调用System.exit(0) ,则最终不再执行块。

您应该尝试使用下面的代码关闭您的应用:

 Gdx.app.exit(); 

我通常将它放在我的pause()方法中,因为我的应用程序没有理由在后台运行。

此静态方法告诉框架您的应用程序正在计划关闭,因此将有效地释放所有资源。 您获得的错误是因为JNI接口已加载OpenAL库,但在正确卸载和释放该库之前系统已关闭。 我遇到了和你一样的问题,但这解决了它。 如JavaDoc中所述,exit()方法:

安排[s]退出申请。 在android上,这将导致在将来的某个时间调用pause()dispose() ,它不会立即完成您的应用程序。