и снова о проблемах памяти с SoundPool - PullRequest
5 голосов
/ 04 ноября 2010

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

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

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

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

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

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 05 ноября 2010

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

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

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

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

0 голосов
/ 05 ноября 2010

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

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

...