我正在做简单的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
}
}
答案 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 开始提供修复