我最近完成了一个小游戏,并一直试图为其添加音频。目前我所拥有的音响系统正在运行(与最常见答案基本相同的代码here ),但每次输出(~200-300 ms)都会出现严重失速。由于这是一个快速的游戏,我正在寻找更快速的东西。我对Threads没有经验,但这些适用于此吗?
答案 0 :(得分: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
实例以播放声音(就像在原始方法中完成的那样,但它在写入之前就从文件中读取它们。)
答案 1 :(得分:0)
您可以尝试将BufferedInputStream传递给重载方法AudioSystem.getAudioInputStream(),而不是传递文件。
答案 2 :(得分:0)
对drain
的调用是阻止的,它会导致您观察到的延迟。你不需要在那里等。但是,如果您让声音输出与其他代码并行运行,您还应该定义如果声音缓冲区中有很多声音并且您排队的话会发生什么。了解available
方法和API的其余部分,以便能够灵活地管理声卡,而不会产生任何“滞后声音”效果。
线程也可以用于此目的,但这里没有必要。声音驱动程序本身可以充分发挥并行过程的作用,单线程方法将使您的应用程序更易于设计,更易于调试。
答案 3 :(得分:0)
尽管我想接受其中一个现有答案,但我以一种简单的方式解决了我的问题。通过在初始化期间加载所有引用的File
变量,延迟不会在游戏过程中的任何时刻返回。但是,如果这对于查看此问题的其他人来说不是一个合适的解决方案,我也会推荐Vulcan的答案。