2016-06-09 9 views
1

Я использую WebAudio для воспроизведения музыкальных треков. Во-первых, я полностью расшифровать его сПравильный способ очистки памяти от декодированного аудиопотока (мобильный)

self.ctx.decodeAudioData(xhr.response, function (buffer) { 
    this.cache = buffer; 
}) 

и сохранить декодированного буфер некоторой переменной в течение времени, когда мне нужно, чтобы начать играть.

Когда я хочу, чтобы переключить трек, я очистки аудио узел с

node.source.onended = function (value) { 
    node.source = null; 
}; 

и кэш:

this.cache = null;

и декодировать следующий трек той же переменной ,

Проблема заключается в том, что я несколько раз переключаю дорожку (например, 3-4 трека 3мин), мобильные браузеры на базе iOS просто перезагружают страницу, поскольку, кажется, я использую всю доступную память для вкладки , Хотя я использую только одну переменную буфера, я думаю, сборщик мусора не освобождает память аудио буферов, которые я больше не использую.

Любые идеи по улучшению реализации?

+0

Вы уверены, что * вы освободили * каждую * ссылку на память, включая объект 'xhr'? Можете ли вы сделать [mcve], чтобы продемонстрировать проблему. –

+0

Как например - это может быть проблематично tbh. В основном потому, что мне нужно создать отдельный минималистский пример, который покажет проблему. И дело не в том, что вы можете сделать на лету tbh. Я постараюсь сегодня вечером. – North

+0

Что касается ссылки на память - у нас есть 3 из них, как я вижу: 1. Кэш - мы его очищаем 2. node.source.buffer - мы не можем напрямую очистить буфер, но мы очищаем переменная node.source. Поэтому он должен заботиться о проблеме. 3. объект xhr. Запрос выполняется в частной функции, а xhr.response передается в self.ctx.decodeAudioData. Нужна ли нам дополнительная очистка для этого случая? – North

ответ

0

Как оказалось - проблема была с сборщиком мусора. Для правильной очистки предыдущей памяти требуется 20-30 секунд. Так что решение, которое сработало для меня - я начинаю играть и отключать возможность переключения на другую дорожку в течение 30 секунд. Достаточно времени, чтобы память очищала все.