java - 在游戏中缓存 .mid 音频文件

标签 java caching audio inputstream

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

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

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 文件的适当方法,以便可以在应用程序中快速访问和播放它们?

最佳答案

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

才读取文件

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

The Clip interface represents a special kind of data line whose audio data can be loaded prior to playback, instead of being streamed in real time.

例如,您可以将剪辑放置在 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();

关于java - 在游戏中缓存 .mid 音频文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16404106/

相关文章:

audio - 请推荐在 IE 浏览器中嵌入的音频播放器

php - 使用PHP流/缓冲大型音频文件

java - 如何获取 Spark Java 应用程序自动定义的端口?

java - 目前没有活跃的交易

java - 什么标准规定 Java SE 的实现应该包含哪些类?

caching - memcached 中的数据应该有多细粒度?

session - Golang 和 Gorilla session - 缓存阻止注销功能

java - 将元素与不工作的特定元素匹配 JList ActionListener

r - 根据 block 内容设置 block 选项

android - 使用onAudioFocusChange停止其他音乐应用