AVAudioPlayer, не разгружающий кэшируемую память после каждого нового выделения

Я вижу в Инструментах, что, когда я играю звук с помощью стандарта метод "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 метод, конечно.

1
задан iwasrobbed 3 May 2010 в 04:08
поделиться

1 ответ

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

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

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

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

2
ответ дан 3 September 2019 в 00:53
поделиться