У меня проблемы с производительностью при использовании SoundPool. Каждый раз, когда я играю звук, частота кадров падает. Я добавил несколько логов и вижу на logcat, что функция «play» иногда занимает 8 мс.
Я использую * .ogg файлы, и инициализация SoundPool выполняется при запуске приложения:
mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
mSoundPool = new SoundPool(size, AudioManager.STREAM_MUSIC, 0);
mSoundPoolMap = new HashMap<Integer, Integer>();
mSoundPoolMap.put(index, mSoundPool.load(context, R.raw.shot, 1));
Для воспроизведения звука я использую следующий код (внутри игрового цикла):
mSoundPool.play(id, streamVolume, streamVolume, 1, loop, 1f);
Мои вопросы:
- Должен ли я вызывать "играть" в другом потоке, вне игрового цикла?
- Должен ли я позвонить "играть" через службу?
- Я что-то не так делаю?
Спасибо!
UPDATE:
Я только что протестировал воспроизведение звука в другом потоке и воспроизведение звука через службу, но задержка все еще присутствует.
Тогда я сделал следующие тесты:
* воспроизводить звук с интервалами 1000 мс -> задержка всегда происходит
* воспроизводить звук с интервалами 200 мс -> задержка НИКОГДА не происходит
Как это возможно?!?!?
После этих тестов кажется, что когда ничего не воспроизводится, SoundPool сбрасывается, а когда он снова начинает играть, инициализация занимает больше времени ... очень странно!