libgdx在收集苹果时收听sound.play()时滞后

时间:2014-07-27 18:03:02

标签: java android audio libgdx

我正在做简单的libgdx游戏。当我使用sound.play()时,我有滞后(游戏停止为0.5秒) 编辑这个bug apear on android 4.0 on 2.3一切正常。

方法。我用这段代码播放声音:

if(CollisionDetector.detect(touchArea, hoodie.getTouchArea())){
        GameScreen.totalScore++;
        setPosition();
        System.out.println("played");

        Assets.eatSound.play();

}

我用这种方法加载声音:

 static long waitForLoadCompleted(Sound sound,float volume) {
        long id;
        while ((id = sound.play(volume)) == -1) {
            long t = TimeUtils.nanoTime();
            while (TimeUtils.nanoTime() - t < 100000000);
        }
        return id;
 }

我做错了什么?或者我该怎么做才能解决这个滞后问题?

修改

我刚尝试用sound.play()做线程,但它也不起作用:

    new Thread(new Runnable() {
           @Override
           public void run() {
              // do something important here, asynchronously to the rendering thread

              // post a Runnable to the rendering thread that processes the result
              Gdx.app.postRunnable(new Runnable() {
                 @Override
                 public void run() {
                    // process the result, e.g. add it to an Array<Result> field of the ApplicationListener.
                eatSound2.play();
                 }
              });
           }
        }).start();

My Sound资产类看起来像这样,但我仍然有声音滞后。 包com.redHoodie;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.audio.Sound;
import com.badlogic.gdx.utils.Disposable;

public class SoundEffect implements Disposable {
   private static final int WaitLimit = 1000;
   private static final int ThrottleMs = 100;
    Sound eatSound;
    Sound endSound;

    public SoundEffect(){
        eatSound = Gdx.audio.newSound(Gdx.files.internal("eatSound.ogg"));
        endSound = Gdx.audio.newSound(Gdx.files.internal("sadend.wav"));

        checkedPlay(eatSound);
    }

   protected long checkedPlay (Sound sound) {
      return checkedPlay(sound, 1);
   }

   protected long checkedLoop (Sound sound) {
      return checkedLoop(sound, 1);
   }

   protected long checkedPlay (Sound sound, float volume) {
      int waitCounter = 0;
      long soundId = 0;

      boolean ready = false;
      while (!ready && waitCounter < WaitLimit) {
         soundId = sound.play(volume);
         ready = (soundId != 0);
         waitCounter++;
         try {
            Thread.sleep(ThrottleMs);
         } catch (InterruptedException e) {
         }
      }

      return soundId;
   }

   protected long checkedLoop (Sound sound, float volume) {
      int waitCounter = 0;
      long soundId = 0;

      boolean ready = false;
      while (!ready && waitCounter < WaitLimit) {
         soundId = sound.loop(volume);
         ready = (soundId != 0);
         waitCounter++;
         try {
            Thread.sleep(ThrottleMs);
         } catch (InterruptedException e) {
         }
      }

      return soundId;
   }

@Override
public void dispose() {
    // TODO Auto-generated method stub

}
}

3 个答案:

答案 0 :(得分:5)

我遇到了同样的问题。这是因为我的.mp3文件太短了。我的长度是0.167秒。我用Audacity加了1.2秒的沉默,这解决了问题。

答案 1 :(得分:0)

最近我遇到了同样的问题(除了我使用的是wav而不是mp3文件)。当我同时播放许多声音(例如10或20)(相同的渲染方法)时,我的应用程序出现了滞后现象。通过仅播放1个声音来“解决”此问题。通常,很难同时区分许多声音。同样在桌面上也可以,但是在android(9或8)上会出现问题。

答案 2 :(得分:0)

如果有人像我一样仍然面临这个问题,那么有一个替代解决方案,但有一个限制:没有使用声音 ID 的选项。

您可以通过在 AsynchronousAndroidAudio 类中覆盖此方法来更改默认的 LibGDX 行为并使用 AndroidLauncher

@Override
public AndroidAudio createAudio(Context context, AndroidApplicationConfiguration config) {
    return new AsynchronousAndroidAudio(context, config);
}

有关详细信息,请参阅 official documentation 以及 the pull request

此外,如果出于任何原因您需要声音 ID,您可以以此实现为例,并为您的项目找到解决方法。

从 LibGDX 1.9.12 开始提供修复