Если время инициализации является вашей единственной задачей, вы можете * создать это во вторичном потоке и улучшить воспринимаемое время запуска.Затем он запускает потоки и декодеры и открывает аудиофайлы с диска из вторичного потока.
Если воспроизведение, подсчет потока, использование памяти, ЦП, время загрузки, декодирование, фильтрация, повторная выборка и т. Д.факторы по-прежнему: вы используете API-интерфейсы самого высокого уровня, вы можете опустить несколько уровней и получить полный контроль над каждым из этих аспектов.
Вы можете сделать его лучше, если его рефакторинг -- метод выполняет аналогичную последовательность четыре раза.
* 'возможно', поскольку я использовал только API более низкого уровня, я не знаю, имеет ли AVAudioPlayer ограничения потоков.
Пример рефакторинга с добавленной проверкой ошибок:
Не скомпилировано, но вы получите идею:
- (AVAudioPlayer *)newAudioPlayerForFile:(NSString *)fileName extension:(NSString *)extension inBundle:(NSBundle *)bundle
{
assert(fileName && extension && bundle);
NSURL * url = [bundle URLForResource:fileName ofType:extension];
if (nil == url) {
assert(0 && "could not locate resource");
return nil;
}
NSError * error = 0;
AVAudioPlayer * spieler = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
assert(spieler);
if (nil != error) {
NSLog(@"Error encountered creating audio player for file (%@): %@", fileName, error);
[spieler release], spieler = nil;
return nil;
}
[spieler prepareToPlay];
[spieler setDelegate:self];
return spieler;
}
- (void)readySounds
{
NSAutoreleasePool * pool = [NSAutoreleasePool new];
NSBundle * mainBundle = [NSBundle mainBundle];
self.tr1 = [[self newAudioPlayerForFile:@"TrackUno" extension:@"mp3" inBundle:mainBundle] autorelease];
self.tr2 = [[self newAudioPlayerForFile:@"TrackDos" extension:@"mp3" inBundle:mainBundle] autorelease];
self.clk = [[self newAudioPlayerForFile:@"Click" extension:@"mp3" inBundle:mainBundle] autorelease];
self.hs = [[self newAudioPlayerForFile:@"HSSound" extension:@"mp3" inBundle:mainBundle] autorelease];
[pool release], pool = nil;
}