1

这个问题可能看起来很简单。我正在做一个游戏项目,所以现在我需要实现一个声音引擎。

我有几个音频文件要播放。我这样做:

File file = new File("music.mid");
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(file);
Clip clip = AudioSystem.getClip();
clip.open(audioInputStream);
clip.start();

现在我正在尝试缓存这些文件以通过 HashMap 提高性能:

private HashMap<String, File> cache = new HashMap(); //name - key & file - res

我检查 hashmap 中的文件,如果存在则将其取出并重用。

但是,每次我需要播放文件时,似乎仍然会下载音频资源。 (可能是输入流再次生成左右)

游戏每次都开始滞后。


您能否向我展示一种缓存.mid文件的适当方式,以便可以在应用程序中快速访问和播放它们?

4

1 回答 1

1

Java 中的File对象实际上并不包含文件的内容,它只是文件的句柄。事实上,文件直到Clip#open

大多数操作系统通常会将读取的文件缓存到 RAM,因此在大多数情况下您不需要自己做。如果您需要更多的缓存功能,请缓存Clip对象:

Clip 接口代表一种特殊的数据线,其音频数据可以在播放之前加载,而不是实时流式传输。

例如,您可以将剪辑放在HashMap

HashMap<String, Clip> clips = new HashMap<String, Clip>();
for (String fileName: fileNames) {
    File file = new File(fileName);
    AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(file);
    Clip clip = AudioSystem.getClip();
    clip.open(audioInputStream);
    clips.put(fileName, clip);
}

clips.get("music.mid").start();
于 2013-05-08T06:11:56.790 回答