и снова о проблемах с памятью у SoundPool

Я знаю, что SoundPool был предназначен для обработки небольших эффектов, таких как звуки, и я убедился, что мои 4 звуковых клипа, которые я хочу воспроизвести один за другим в некоторой последовательности, достаточно малы.

Я использовал качество ogg 0 и клипы размером 35 КБ, 14 КБ, 21 КБ и 23 КБ, всего 92 КБ сжатого звука. Я понятия не имею, как оценить размер несжатого файла, но его не должно быть много, верно?

Поэтому, когда я воспроизвожу 4 звука подряд, он хорошо работает первые 9 раз (9 последовательностей x 4 звука), но начинает вызывать проблемы с памятью в последовательности девяток для одного из звуков. Это всегда последовательность 9, когда я начинаю видеть ошибку.

Каков наилучший способ справиться с этим? У меня есть несколько идей:

1) ещё сильнее сжать звуки (качество ogg -1 и моно вместо стерео)

2) постоянно выгружать и загружать звуки с помощью SoundPool.load и SoundPool.unload

3) время от времени выпускать и воссоздавать экземпляр soundPool

Есть ли что-нибудь еще, что я могу сделать? Смущает, что android api не справляется с такими маленькими роликами. Интересно, как люди создают игры с большим количеством звуковых эффектов...

Ошибки выглядят так:

ОШИБКА/AudioFlinger(35): недостаточно памяти для AudioTrack size=1048640 DEBUG/MemoryDealer(35): AudioTrack (0x25018, size=1048576)


person mishkin    schedule 04.11.2010    source источник


Ответы (2)


Кажется, я смог решить свою проблему после:

1) понизил частоту дискретизации моих звуковых клипов с 44 до 22 кГц. Несжатый размер был уменьшен вдвое (я придумал, как оценить несжатый размер звука - экспортировать свой клип в несжатый wav). Я использовал хороший инструмент с открытым исходным кодом Audacity

2) обрезать звуки больше, чтобы уменьшить продолжительность

3) на всякий случай поставьте try/catch рядом с play() (он ловит ошибки, когда пытается воспроизвести звук, но не может)

person mishkin    schedule 05.11.2010
comment
Спасибо, это работает для меня. До этого мой звуковой файл обрезался. Но я преобразовал и передискретизировал этот m4a с 44 на 22, и теперь он работает без обрезки. - person Shreyash Mahajan; 29.10.2012

Это кажется странным. SoundPool должен расширять ваши аудиоклипы в памяти при их загрузке, и после загрузки я не ожидаю, что вы столкнетесь с проблемами памяти позже. Когда я сталкивался с проблемами памяти, это было в самом начале, а не позже. Вы уверены, что не загружаете больше звуков позже?

Чтобы ответить на ваш другой вопрос, некоторые игры используют JET Player и звуки MIDI вместо SoundPool. Образец программы JetBoy, входящий в состав Android SDK, является отличным примером того, как можно реализовать этот тип работы со звуком в приложении.

person Dave MacLean    schedule 05.11.2010
comment
спасибо за ответ ... Сегодня я протестировал свое приложение и заметил, что проблема возникает с 4 звуками, которые я зацикливаю, используя зацикливание звукового пула. Я загрузил 17 других клипов, и они работают нормально, но после того, как мое приложение запускает один из 4 зацикленных клипов, оно вылетает. Я предварительно загружаю их все при создании активности и больше нигде. Я понизил разрешение своих клипов с 44 до 22 кГц, и это немного помогло, но приложение по-прежнему вылетает из-за проблем с памятью. - person mishkin; 05.11.2010
comment
мне нужно воспроизвести файлы ogg, поэтому я думаю, что JetBoy мне не подходит, но спасибо за предложение - person mishkin; 05.11.2010