2

我最近完成了一个小游戏,并一直在尝试为其添加音频。目前我拥有的音响系统正在工作(基本上与这里的最佳答案相同的代码 ),但在每次输出(~200-300 ms)期间都有一个明显的停顿。由于这是一款快速游戏,我正在寻找更快的东西。我没有使用线程的经验,但这些是否适用于这里?

4

4 回答 4

3

不是每次您希望以音频格式播放其内容时都读取文件,而是将文件一次读取到字节数组中,然后从该字节数组中读取音频。

public static byte[] getBytes(String file) {
    RandomAccessFile raf = new RandomAccessFile(file, "r");
    byte[] bytes = new byte[(int) raf.length()];
    raf.read(bytes);
    return bytes;
}

然后,您可以简单地更改playSound方法以将字节数组作为参数,然后将它们写入SourceDataLine实例以播放声音(就像在原始方法中所做的那样,但它在写入它们之前从文件中读取它们) .

于 2012-10-19T22:03:49.580 回答
0

您可以尝试将 BufferedInputStream 传递给重载方法 AudioSystem.getAudioInputStream() 而不是传递文件。

于 2012-10-19T22:07:04.740 回答
0

调用drain是阻塞的,它会导致您观察到的延迟。您无需在那里等待。但是,如果您让声音输出与您的其他代码并行运行,您还应该定义如果声音缓冲区中有大量声音并且您排队更多时会发生什么。了解该available方法和 API 的其余部分,以便能够灵活地管理声卡并且没有任何“滞后声音”效果。

线程也可以用于此目的,但这里没有必要。声音驱动程序本身可以充分发挥并行进程的作用,单线程方法将使您的应用程序更易于设计和调试。

于 2012-10-19T22:09:02.940 回答
0

尽管我很想接受这些现有答案之一,但我以一种简单的方式解决了我的问题。通过在初始化期间加载所有引用的File变量,延迟不会在游戏过程中的任何时候回来。但是,如果这对于查看此问题的其他人来说不是一个足够的解决方案,我也会推荐 Vulcan 的回答。

于 2012-10-21T20:09:41.613 回答