SoundPool play() блокирует рендеринг

Я использую 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()занимает так много времени? Как я могу отделить его от моего потока игры/рендеринга, чтобы он не влиял на игровой процесс?


person Thomas Hartmann    schedule 11.11.2016    source источник


Ответы (1)


Просто используйте вместо этого Mediaplayer... Не беспокойтесь об отладке этого. Кажется, что нет никакого реального решения этой проблемы. Только этот хак.

person Thomas Hartmann    schedule 11.11.2016