0
我正在写一个游戏(-engine),其中我想要有一些音效。我的代码很好地处理了一个wav
文件。但是,当我尝试加载mid
文件时,花费了大约6秒。这是我的SSCCE:我的机器上加快音乐加载
import java.io.*;
import java.net.URL;
import javax.sound.sampled.*;
public class Sound {
private ByteArrayInputStream bais;
public Sound(URL u) throws Exception {
bais = readAll(u);
createClip(); // XXX too slow
}
private Clip createClip() throws Exception {
bais.reset();
AudioInputStream audioInputStream = AudioSystem
.getAudioInputStream(bais);
Clip clip = AudioSystem.getClip();
clip.open(audioInputStream); // XXX too slow
audioInputStream.close();
return clip;
}
public static ByteArrayInputStream readAll(URL u) throws IOException {
InputStream is = u.openStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] bytes = new byte[4096];
for (int len; (len = is.read(bytes)) > 0;)
baos.write(bytes, 0, len);
is.close();
return new ByteArrayInputStream(baos.toByteArray());
}
public static void main(String[] args) throws Exception {
{
long start = System.nanoTime();
new Sound(Sound.class.getResource("click.wav")); // fast enough
long end = System.nanoTime();
System.out.println("Time: " + (end - start)/1e9 + " seconds");
}
{
long start = System.nanoTime();
new Sound(Sound.class.getResource("music.mid")); // XXX too slow
long end = System.nanoTime();
System.out.println("Time: " + (end - start)/1e9 + " seconds");
}
}
}
输出:
Time: 0.295358713 seconds
Time: 5.695282061 seconds
此外,我曾试图Applet.newAudioClip
,这是不是更快。 这是我的机器的环境:
- 操作系统:Windows 7旗舰版64位
- 处理器:Pentium(R)双核CPU E6300 @ 2.80GHz的2.53GHz的
- 安装的内存(RAM ):2.00GB 我用
java version "1.7.0_17" Java(TM) SE Runtime Environment (build 1.7.0_17-b02) Java HotSpot(TM) 64-Bit Server VM (build 23.7-b01, mixed mode)
- 精确音乐文件:click.wav和music.mid (the slow one)
- 精确
Sound
类我用:Sound.java或Sound.txt
当我使用其他游戏引擎打开mid
文件,游戏启动瞬间,所以必须有一种方法来加快加载。 我想知道如何加快这样的音乐文件的加载,没有比我的游戏库大。
我不明白这里的逻辑,为什么要复制到内存中的网址?有你尝试过的'ClassLoader.getResourceAsStream()'? –
@BoristheSpider因为我想多次加载音乐(所以我可以同时播放两个相同的声音)。此外,正如我测试,将文件读入内存立即完成。 – johnchen902