Questa domanda potrebbe essere troppo vago per passare norme StackOverflow's
, ma devo provare distacco, perché io sono a corto di opzioni ...:/AVAudioPlayer e Random lentezza
Per farla breve: Ho un app che sperimenta periodi casuali di lentezza. Non succede troppo spesso (probabilmente una volta al mese), ma quando fa il solo un riavvio completo dell'iDevice su cui è in esecuzione. I sintomi sono: 2-3 secondi tempi di risposta e animazioni lente e instabili; l'intera app diventa praticamente inutilizzabile.
Avevo eseguito l'app attraverso tutti i possibili strumenti di diagnostica, nessuno dei quali ha trovato qualcosa di sbagliato; nessuna perdita di memoria o utilizzo insolitamente elevato della CPU. Ma questo non è sorprendente, considerando che l'app è estremamente semplice, un'app tracker per un gioco di carte.
Tutto questo mi ha portato a credere che il AVAudioPlayer
io uso per riprodurre i suoni quando l'utente tocca un button
potrebbe essere la causa del problema (che è l'unico, relativamente alto elemento di complessità in tutta l'app). Sono, tuttavia, non sono sicuro, che è dove ho bisogno di aiuto. Includo un codice di esempio qui e forse qualcuno con esperienza nella riproduzione audio iOS
potrebbe guardarlo e vedere se c'è qualche errore che ho trascurato.
Eccoci: Per prima cosa, inizializzo un "lettore silenzioso" che continua a riprodurre una traccia silenziosa ogni secondo per mantenere in vita AVAudioPlayer
. È necessario a causa del tempo di risposta relativamente lungo delle esperienze AVAudioPlayer
quando viene chiamato dopo un periodo di inattività più lungo.
NSString *silenceFilePath = [[NSBundle mainBundle] pathForResource: @"silence" ofType: @"wav"];
NSURL *silenceFileURL = [[NSURL alloc] initFileURLWithPath: silenceFilePath];
silencePlayer = [[AVAudioPlayer alloc] initWithContentsOfURL: silenceFileURL error: nil];
[silencePlayer setDelegate: self];
[silencePlayer prepareToPlay];
silenceTimer = [NSTimer scheduledTimerWithTimeInterval:1.0f
target:self
selector:@selector(repeatSilence)
userInfo:nil
repeats:YES];
Il NSTimer chiama il seguente metodo:
- (void) repeatSilence
{
if (isAudioON == YES)
{
if (silencePlayer.playing)
{
[silencePlayer stop];
silencePlayer.currentTime = 0;
[silencePlayer play];
}
else
{
[silencePlayer play];
}
}
}
Il resto è abbastanza semplice. Io inizio un'altra AVAudioPlayer per riprodurre un suono specifico tasto (ce ne sono due di questi):
NSString *buttonSoundFilePath = [[NSBundle mainBundle] pathForResource: @"button_pushed" ofType: @"wav"];
NSURL *buttonFileURL = [[NSURL alloc] initFileURLWithPath: buttonSoundFilePath];
buttonPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL: buttonFileURL error: nil];
[buttonPlayer setDelegate: self];
[buttonPlayer prepareToPlay];
E quando il pulsante viene premuto suono il suono (allo stesso modo come ho fatto con il giocatore silenzioso):
if (isAudioON == YES)
{
if (buttonPlayer.playing)
{
[buttonPlayer stop];
buttonPlayer.currentTime = 0;
[buttonPlayer play];
}
else
{
[buttonPlayer play];
}
}
E davvero tutto quello che c'è da fare. Temo, tuttavia, che, nonostante la semplice natura di questo metodo, in qualche modo questa riproduzione audio continua crei un raro esempio in cui iOS impazzisce. Ma tutto questo è solo una teoria, ed è per questo che ho bisogno di qualcuno con più esperienza per dare un'occhiata al mio codice e condividere la sua opinione.
Grazie!
Aggiornamento: Ho trovato altre righe di codice che potrebbero anche essere rilevanti per il problema. Con loro, ho impostato l'AVAudioPlayer di lavorare contemporaneamente con la musica di sottofondo (da un'altra applicazione, per esempio):
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil];
[[AVAudioSession sharedInstance] setActive:YES error:nil];
[[AVAudioSession sharedInstance] setDelegate:self];
Buoni approfondimenti. Darò loro una prova questo fine settimana e condividerò i risultati! –