9

我正在尝试让自己参与到 Libgdx OpenGL 框架中。我曾经LwjglApplication创建过一些简单的应用程序来渲染盒子、一些网格和一些纹理。我遇到了 Aurelien Ribon 的创建刚性 Box2D 物体的应用程序。他用来LwjglCanvas与 Java 的 Swing 集成。我尝试自己制作一个,我创建了一个JFrame然后添加了LwjglCanvas. 然后将JFrame' 的默认操作设置为 close to 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 个设备未关闭”的真正含义是什么?

非常感谢!

4

3 回答 3

12

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

于 2014-05-17T17:39:10.603 回答
8

您应该尝试始终使用以下代码关闭您的应用程序:

Gdx.app.exit();

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

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

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

于 2013-07-02T05:55:24.047 回答
7

AL 库是 Libgdx(OpenAL 变体之一)使用的“音频库”。

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

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

有关更多详细信息,请alc_cleanup在此处查找: http ://repo.or.cz/w/openal-soft.git/blob/HEAD:/Alc/ALc.c

于 2013-04-23T15:59:49.367 回答