Avaudioplayer не разгружая кэшированную память после каждого нового распределения

StackOverflow https://stackoverflow.com/questions/2756055

Вопрос

Я вижу в инструментах, которые, когда я воспроизводя звук через стандартный метод «Addmusic», который предоставляет Apple, он выделяет 32 КБ памяти через prepareToPlay звонить (что ссылается на AudioToolBox структуры Cache_DataSource::ReadBytes Функция) Каждый раз, когда выделяется новый игрок (т.е. каждый раз, когда воспроизводится другой звук). Однако эти кэшированные данные никогда не выпускаются.

Это, очевидно, создает огромную проблему, если она не будет выпущена, и у вас есть много звуковых файлов, так как он, как правило, сохраняет распределение памяти и в конечном итоге вылетает, если у вас достаточно уникальных звуковых файлов (что, к сожалению, делаю).

Кто -нибудь из вас столкнулся с этим или что я делаю не так в своем коде? У меня была эта проблема некоторое время, и это действительно беспокоит меня, так как мой код является дословным тем, что такое Apple (я думаю).

Как я называю функцию:

- (void)playOnce:(NSString *)aSound {

// Gets the file system path to the sound to play.
NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:aSound ofType:@"caf"];  

// Converts the sound's file path to an NSURL object
NSURL *soundURL = [[NSURL alloc] initFileURLWithPath: soundFilePath];
self.soundFileURL = soundURL;
[soundURL release];

AVAudioPlayer * newAudio=[[AVAudioPlayer alloc] initWithContentsOfURL: soundFileURL error:nil];  
self.theAudio = newAudio; // automatically retain audio and dealloc old file if new m4a file is loaded

[newAudio release]; // release the audio safely

// this is where the prior cached data never gets released
[theAudio prepareToPlay];

// set it up and play
[theAudio setNumberOfLoops:0];
[theAudio setVolume: volumeLevel];
[theAudio setDelegate: self];
[theAudio play];

}

а потом theAudio выпускается в dealloc Метод конечно.

Это было полезно?

Решение

Ответ из другого источника по имени Smasher:

Вам нужен отдельный игрок для каждого звука с Avaudioplayer; Там нет выбора. И единственный способ освободить память от игрока - это правильно выпустить после того, как она закончила играть. Просто призыв к "Stop", поддерживает игрока в живых, чтобы вы могли играть его снова и не освободить память.

У Openal есть подобные проблемы, вы загружаете звук для каждого файла; Кроме того, самая распространенная реализация, которую я видел, загружает весь файл одновременно, что жестко для памяти.

Вы, вероятно, должны выпустить игрока, когда он перестает играть, или когда вы выбираете новый звук, или перед созданием игрока для нового звука.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top