首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >经常播放短音频剪辑时的Java -滞后

经常播放短音频剪辑时的Java -滞后
EN

Stack Overflow用户
提问于 2018-03-28 13:24:56
回答 1查看 1.1K关注 0票数 5

在互联网上做了几天的研究之后,我来到这里寻求帮助。我目前正在为朋友们开发一个2D游戏(其实只是为了好玩),几天前我学到了一些片段。在这个游戏中,玩家可以收集物体(就像马里奥中的硬币一样)。我的问题是,当收集硬币时,我有一个很短的声音(~ 1秒,50 in ),如果玩家在1秒内收集3枚硬币,那么剪辑会使游戏滞后。如果先例剪辑已经结束,那么就不会有任何滞后。但是,如果之前的剪辑还没有结束,那么尝试再次播放剪辑会使游戏滞后(非常严重)。

我有一台很小的电脑,不太强大,但是这个问题真的很烦人。当玩家投掷武器时,我也会遇到同样的问题。我有一个很短的剪辑,如果玩家把这个武器扔得太快,游戏就会滞后.

以下是我已经尝试过的事情:

  • 使用一系列剪辑(同一声音),并播放当前未播放的剪辑。
  • 使用不同的剪辑(相同的声音),和以前一样。
  • 复制多份(同一声音),并将其装入不同的剪辑中
  • 制作一个单独的线程来播放声音,但我对线程一点也不舒服:/

但这些都改变不了这个问题..。

这是我代码的一部分。首先是我用来将声音加载到剪辑中的类。

代码语言:javascript
复制
package sound;

import java.io.IOException;
import java.net.URL;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
// My own package
import utils.Utils;

public class SoundLoader {

public static Clip loadSound(String path) {
    Utils.log("Loading " + path + " ... ");

    try {
        URL url = SoundLoader.class.getResource(path);
        AudioInputStream audioIn = AudioSystem.getAudioInputStream(url);
        AudioFormat format = audioIn.getFormat();

        DataLine.Info info = new DataLine.Info(Clip.class, format);
        Clip clip = (Clip)AudioSystem.getLine(info);
        clip.open(audioIn);

        Utils.log("success\n");
        return clip;
    } catch (UnsupportedAudioFileException | IOException | LineUnavailableException e) {
        e.printStackTrace();
        Utils.log("failed !\n");
        return null;
    }
}   
}

现在是我将处理所有声音的课程:

代码语言:javascript
复制
package sound;

import javax.sound.sampled.Clip;
// My own package   
import principal.Handler;

public class SoundManager {

    private Clip woosh;
    private Clip coin1;
    private Clip coin2;

    public SoundManager(Handler handler) {
        woosh = SoundLoader.loadSound("/resources/sounds/woosh2.wav");
        coin1 = SoundLoader.loadSound("/resources/sounds/coin1.wav");
        coin2 = SoundLoader.loadSound("/resources/sounds/coin2.wav");
    }

    public void wooshClip() {
        startClip(woosh);
    }
    public void coin1Clip() {
        startClip(coin1);
    }
    public void coin2Clip() {
        startClip(coin2);
    }   
    public synchronized void startClip(Clip clip) {
        clip.stop();
        clip.setFramePosition(0);
        clip.start();
    }
    public void loopClip(Clip clip) {
        clip.loop(Clip.LOOP_CONTINUOUSLY);
    }
    public void stopClip(Clip clip) {
        clip.stop();
    }

}

最后,当我想播放一个剪辑时,我使用我的"Player“类中的公共方法startClip() (显然代表该播放器)。

handler.getSoundManager().wooshClip();

正如我看到的代码一样,如果剪辑已经在播放,那么方法starClip()应该停止并重放它。为什么它会落后这么多?为什么即使我使用不同的剪辑,它也是滞后的?什么使我的游戏滞后,如果我只是停止一个剪辑,并重播它?

我希望你能帮我..。我很少能在网上找到答案。如果你还需要什么来回答我就告诉我!

谢谢你花时间在这个长长的问题上!

编辑:我尝试了我的游戏在一个强大的电脑和绝对没有滞后,因为音频剪辑.但我的问题依然存在!一个50 so的剪辑怎么会有这么大的滞后?我真的不明白这个问题..。

溶液

我刚在做这个项目的时候发现了一个解决方案:现在我的实体在被玩家收集时应该播放一个声音(比如马里奥中的硬币声音)包含了他们“死亡”的音频剪辑。我不明白为什么它现在起作用了但它确实..。

EN

回答 1

Stack Overflow用户

发布于 2020-06-27 18:59:13

使用来自JavaFX的JavaFX而不是javax.sound.sampled.Clip。AudioClip具有较低的潜伏期。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49535824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档