我尝试在屏幕上同时写一些10-30单位的游戏。
每个单元都有不同的声音:
所以我完全有4x30 = 120 wav
个文件。
肯定应该是一些调度员,以防止同时播放几个声音。
我的问题是:
我是否需要将SoundPool
添加到每个单元对象或使用SoundPool singelton
创建单独的类,并按此类管理所有单元。
我可以尝试两种选择,但我担心它会导致内存泄漏和性能。
谢谢
答案 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 + "'");
}
}