将SoundPools用于Android中的许多对象的最佳方法是什么?

时间:2013-07-12 14:53:36

标签: android soundpool

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

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

  • 中性
  • 被击中
  • 攻击

所以我完全有4x30 = 120 wav个文件。

肯定应该是一些调度员,以防止同时播放几个声音。

我的问题是:

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

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

谢谢

1 个答案:

答案 0 :(得分: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 + "'");
    }
}