Sound使应用程序在Android上落后-任何解决方案?

问题描述 投票:0回答:2

所以我的游戏在PC上流畅运行(赢得10),但在android手机(Mi 9T pro,SD 855、6GB ram)上却落后了。我并不是说声音只会滞后,图形也会滞后。当我禁用声音时,它运行得非常流畅(应该如此)。

是的,我知道这个问题已经问过很多次了。我尝试了所有提供的“解决方案”,但没有任何帮助。使用22KHz样本,44.1Khz,48Khz进行了尝试。尝试在每个样本的末尾添加1秒的静音。没有帮助。

我正在使用这种方法加载样品:

private void loadSounds(String path)
{
    FileHandle dirHandle;
    dirHandle = Gdx.files.internal(path);
    for (FileHandle entry: dirHandle.list()) {
        Sound sound = new Sound(entry.nameWithoutExtension(), path+"/"+entry.name());
        sounds.add(sound);
    }
}

Sound类看起来像这样:

public class Sound {
    public String name;
    private com.badlogic.gdx.audio.Sound soundObject;

public Sound(String name, String filePath) {
    this.name = name;
    soundObject = Gdx.audio.newSound(Gdx.files.internal(filePath));
}

public void play()
{
    soundObject.play();
}


public void play (float pitch)
{
    soundObject.play(1,pitch,0);
}


public void stop()
{
    soundObject.stop();
}

public void dispose()
{
    soundObject.dispose();
}

}

只是一种通常的方式,没什么特别的。所以我要在应用启动时预加载所有声音样本,然后在游戏中播放它们。玩是造成滞后,这很明显。任何有关如何摆脱android上的这种滞后的建议都值得赞赏。

audio libgdx lag
2个回答
0
投票

不确定延迟,但是您不应同时播放很多声音,因为大多数设备只能输出观看频道。我通常要做的是配备声音管理器,当声音已经播放完毕时,我会停止播放该声音并在一帧中播放新的声音。我个人没有注意到突然停止的声音,我相信很多游戏都是这样做的。

因此,像SoundManager类一样,具有所有声音的数组,列表,设置或映射,并且当您想播放所有声音循环时,如果当前正在播放,则将其停止。

playSound(String soundName){
  for (Sound sound : soundMap) {
    sound.stop();
  }
  soundMap.get(soundName).play();
}

如果出于任何原因确实需要同时播放某些声音,则可以将其扩展为具有多个声音列表。您还可以保留正在播放的声音列表或单个声音对象以直接访问和停止声音。但是只需映射几十种声音,您就不会遇到任何性能问题。


0
投票

通过更严格的声音管理器类解决了这个问题。

首先在加载声音样本期间,我正在计算每个声音样本的持续时间(大约)。原因是LibGDX Sound类没有提供该功能。由于我所有的样本都采用相同格式,因此计算就足够了:

final long WAV_HEADER_SIZE = 2415;
final long WAV_BPS = 41137;
FileHandle file = Gdx.files.internal(filePath);
duration = (long)(1000f * (file.length() - WAV_HEADER_SIZE) / WAV_BPS);

所以我以这种方式获得以毫秒为单位的采样持续时间。样本为22Khz,352Kbps。

然后,当我播放某些声音时,我会记住播放的开始时间,因此,只要有这个持续时间变量,我就可以计算出声音是否还在播放。

通过这个,我可以检查我同时播放了多少声音。当时我最多可以到达8个电话。而且这种情况很少发生,并且不会持续很长时间。常见样本数为0到4或5。

然后,我为每个播放呼叫添加了“优先级”字段(值1-10),在播放声音之前,我正在计算的声音旁边是当前正在播放的采样数,而该声音的优先级最低。

    final int MAX_PRIORITY = 10;
    final int MAX_NUMBER_OF_SOUNDS_PLAYED_SIMULTANEITY = 2;

    if (muted > 0 || soundName.isEmpty()) return;
    Array<Sound> matchedSounds = new Array<Sound>(10);
    int playingCount = 0;

    int lowestPriority = MAX_PRIORITY + 1;
    int lowestPriorityIndex = -1;

    for (int i = 0; i<sounds.size; i++){
        Sound sound = sounds.get(i);
        if (sound.isPlaying()){
            if (sound.priority < lowestPriority){
                lowestPriority = sound.priority;
                lowestPriorityIndex = i;
            }
            playingCount++;
        }
        if (sound.name.startsWith(soundName)) {
            matchedSounds.add(sounds.get(i));
        }
    }

    if (playingCount > MAX_NUMBER_OF_SOUNDS_PLAYED_SIMULTANEITY){
        if (priority <= lowestPriority){
            return;
        }else{
            sounds.get(lowestPriorityIndex).stop();
        }
    }

因此,我首先检查允许的声音数量是否大于当前播放的声音数量。如果不是,我会定期播放新声音。

如果是,并且新声音的优先级低于当前正在播放的所有声音,那么我只是忽略新声音。

如果是,并且新声音不是最低优先级,我将停止最低声音并播放新声音。

这样,我将当前正在播放的声音数量保持为固定值。

最令人惊讶的是,当时没有滞后的最大样本数是2个!!?!播放3种或以上声音时,哪种声音系统会滞后?!?这里确实有问题。

无论如何,即使一次最多采样2个声音,听起来都还不错。缺少的声音不明显。

© www.soinside.com 2019 - 2024. All rights reserved.