gpt4 book ai didi

java - 如何在播放完大量剪辑后立即有效地关闭它们?

转载 作者:行者123 更新时间:2023-11-30 07:46:47 25 4
gpt4 key购买 nike

我有一个使用这种方法播放音效的游戏:

 AudioInputStream inputStream = AudioSystem.getAudioInputStream(
TheGame.class.getResource(url));
Clip clip = AudioSystem.getClip();


clip.open(inputStream);
clip.start();

但是,不关闭剪辑显然会增加内存,而我尝试过的修复偶尔会导致游戏卡住。我试过了:

  1. 为每个剪辑创建一个新的 LineListener,在剪辑停止时关闭该剪辑。经常卡住游戏。
  2. 有一个 LineListener 可以监听每个剪辑,当它们停止时关闭它们。也经常卡住。
  3. 与 #2 相同,但将剪辑分配给多个 LineListener,我尝试了 4、6 和 10,并且都至少卡住了一次游戏。
  4. 永远不要关闭剪辑,最终游戏将停止播放声音并卡住
  5. 剪辑一打开就设置为空,结果与#4 相同

我不确定为什么关闭剪辑似乎要花很多时间,以至于整个游戏都卡住了,有没有更省时的方法?

这是我正在使用的 LineListener 更新方法的代码:

    @Override
public void update(LineEvent event) {
if (event.getType() == LineEvent.Type.STOP){
Clip c = (Clip) event.getSource();
c.close();
c.removeLineListener(this);
}
}

最佳答案

根据我上面的评论,您应该重用现有的 Clip 对象。

Map<String, Clip> clips = new HashMap<String, Clip>();

public synchronized void play(String url) {
Clip clip = clips.get(url);
if(clip == null) {
AudioInputStream inputStream = AudioSystem.getAudioInputStream(
TheGame.class.getResource(url));
Clip clip = AudioSystem.getClip();
clip.open(inputStream);
clips.put(url, clip);
}
if(clip.isRunning())
clip.stop();
clip.setFramePosition(0);
clip.start();
}

如果您需要将相同的声音与自身重叠,则需要更有创意。请注意,我已将它放在 synchronized 方法中,以防止 Map 在您碰巧从多个线程调用它时受到并发修改。

关于java - 如何在播放完大量剪辑后立即有效地关闭它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50378794/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com