Я использую SoundPool для воспроизведения звуков в аркадной игре, которую я создаю. Однако playPassSound()
занимает около 40 мс от начала до конца. Я создаю только 1x SoundPlayer, который загружает все звуки только один раз. Я вызываю playPassSound()
в своем игровом потоке, который также имеет дело с вызовами рендеринга.
Вот как выглядит мой класс SoundPlayer (просто инкапсуляция всего, что связано со звуком):
public class SoundPlayer {
private AudioAttributes audioAttributes;
private final int SOUND_POOL_MAX = 2;
private AudioManager audioManager;
private SoundPool soundPool;
private int soundIdPass;
private float volume;
private boolean passLoaded;
public SoundPlayer(Context context){
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
audioAttributes = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_GAME)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build();
soundPool = new SoundPool.Builder()
.setAudioAttributes(audioAttributes)
.setMaxStreams(SOUND_POOL_MAX)
.build();
}else {
//SoundPool is deprecated as of API Level 21 (Lollipop)
soundPool = new SoundPool(SOUND_POOL_MAX, AudioManager.STREAM_MUSIC, 0);
}
audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
soundIdPass = soundPool.load(context, R.raw.pass, 1);
soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
@Override
public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
if(sampleId == soundIdPass){
passLoaded = true;
}
});
}
public void playPassSound(){
controlVolume();
soundPool.play(soundIdPass, volume, volume, 1, 0, 1f);
}
public void controlVolume(){
float actualVolume = (float) audioManager
.getStreamVolume(AudioManager.STREAM_MUSIC);
float maxVolume = (float) audioManager
.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
volume = actualVolume / maxVolume;
}
}
Почему playPassSound()
занимает так много времени? Как я могу отделить его от моего потока игры/рендеринга, чтобы он не влиял на игровой процесс?