1

我尝试编写一些同时在屏幕上显示 10-30 个单位的游戏。

每个单元都有不同的声音:

  • 中性的
  • 被击中
  • 攻击
  • 死的

所以我总共有 4x30 = 120 个wav文件。

当然,它应该是一些调度程序来防止同时播放多个声音。

我的问题是:

我是否需要添加SoundPool到每个单元对象或使用该类创建单独的类SoundPool singelton并管理所有单元。

我可以尝试两种选择,但我担心它会导致内存泄漏和性能。

谢谢

4

1 回答 1

2

使用下面的类来表示您拥有的每个声音文件。根据需要保留它们,并在使用完它们时将它们丢弃,以避免内存泄漏。

public class AndroidSound implements Sound {
int soundId;
SoundPool soundPool;

public AndroidSound(SoundPool soundPool, int soundId) {
    this.soundId = soundId;
    this.soundPool = soundPool;
}

@Override
public void play(float volume) {
    soundPool.play(soundId, volume, volume, 0, 0, 1);
}

@Override
public void dispose() {
    soundPool.unload(soundId);
}

}

使用以下类的 newSound 方法来获取一个新的 Sound 实例,您可以随时播放和处置该实例。创建您的声音并将它们存储在一个集合中,并根据需要使用它们。

public class AndroidAudio implements Audio {
AssetManager assets;
SoundPool soundPool;

public AndroidAudio(Activity activity) {
    activity.setVolumeControlStream(AudioManager.STREAM_MUSIC);
    this.assets = activity.getAssets();
    this.soundPool = new SoundPool(20, AudioManager.STREAM_MUSIC, 0);
}

@Override
public Music newMusic(String filename) {
    try {
        AssetFileDescriptor assetDescriptor = assets.openFd(filename);
        return new AndroidMusic(assetDescriptor);
    } catch (IOException e) {
        throw new RuntimeException("Couldn't load music '" + filename + "'");
    }
}

@Override
public Sound newSound(String filename) {
    try {
        AssetFileDescriptor assetDescriptor = assets.openFd(filename);
        int soundId = soundPool.load(assetDescriptor, 0);
        return new AndroidSound(soundPool, soundId);
    } catch (IOException e) {
        throw new RuntimeException("Couldn't load sound '" + filename + "'");
    }
}
于 2013-07-12T15:26:19.833 回答