我尝试编写一些同时在屏幕上显示 10-30 个单位的游戏。
每个单元都有不同的声音:
- 中性的
- 被击中
- 攻击
- 死的
所以我总共有 4x30 = 120 个wav
文件。
当然,它应该是一些调度程序来防止同时播放多个声音。
我的问题是:
我是否需要添加SoundPool
到每个单元对象或使用该类创建单独的类SoundPool singelton
并管理所有单元。
我可以尝试两种选择,但我担心它会导致内存泄漏和性能。
谢谢
使用下面的类来表示您拥有的每个声音文件。根据需要保留它们,并在使用完它们时将它们丢弃,以避免内存泄漏。
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 + "'");
}
}