To pytanie może być zbyt ogólnikowe, aby przejść standardy StackOverflow's
, ale muszę spróbować opublikowania go, bo jestem na wyczerpaniu opcji ...:/AVAudioPlayer i Losowa Powolność
Krótko mówiąc: Mam aplikację, która doświadcza losowych okresów spowolnienia. Nie zdarza się to zbyt często (prawdopodobnie raz na miesiąc), ale gdy tylko zrobi się , tylko kompletny restart iDevice, który uruchamia, pomaga. Objawy to: 2-3-sekundowe czasy odpowiedzi i powolne, niepewne animacje; cała aplikacja w zasadzie staje się bezużyteczna.
Przeprowadziłem aplikację przez wszystkie możliwe narzędzia diagnostyczne, z których żaden nie znalazł niczego złego; brak wycieków pamięci lub wyjątkowo wysokie użycie procesora. Ale nie jest to zaskakujące, biorąc pod uwagę, że aplikacja jest bardzo prosta, aplikacja do śledzenia gier karcianych.
Wszystko to doprowadziło mnie do przekonania, że AVAudioPlayer
używam do odtwarzania dźwięków, gdy użytkownik dotknie button
może być przyczyną problemu (jest to jedyny, stosunkowo wysoki element złożoności w całej aplikacji). Nie jestem jednak pewien, w czym potrzebuję pomocy. Załączam tu przykładowy kod, a być może ktoś z doświadczeniem w odtwarzaniu dźwięku mógłby sprawdzić i zobaczyć, czy jest jakiś błąd, którego przeoczyłem.
Oto: Najpierw zainicjuję "cichy odtwarzacz", który co sekundę odtwarza cichy utwór, aby utrzymać przy życiu AVAudioPlayer
. Jest to konieczne ze względu na stosunkowo długi czas odpowiedzi, gdy jest wywoływany po dłuższym okresie bezczynności.
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];
NSTimer wywołuje następujące metody:
- (void) repeatSilence
{
if (isAudioON == YES)
{
if (silencePlayer.playing)
{
[silencePlayer stop];
silencePlayer.currentTime = 0;
[silencePlayer play];
}
else
{
[silencePlayer play];
}
}
}
reszta jest dość prosta. I zainicjować kolejną AVAudioPlayer grać specyficzny dźwięk przycisku (są dwa z nich):
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];
A gdy przycisk jest wciśnięty Gram dźwięk (tak samo jak ja z cichego gracza):
if (isAudioON == YES)
{
if (buttonPlayer.playing)
{
[buttonPlayer stop];
buttonPlayer.currentTime = 0;
[buttonPlayer play];
}
else
{
[buttonPlayer play];
}
}
I naprawdę wszystko na to. Obawiam się jednak, że pomimo prostej natury tej metody, takie ciągłe odtwarzanie dźwięku tworzy rzadką instancję, w której iOS po prostu oszalał. Ale to wszystko jest tylko teorią i dlatego potrzebuję kogoś z większym doświadczeniem, aby rzucić okiem na mój kod i podzielić się z nim swoją opinią.
Dzięki!
Aktualizacja: Znalazłem kilka linii kodu, które mogą być również istotne dla problemu. Wraz z nimi, ja ustawić AVAudioPlayer pracować jednocześnie z odtwarzania muzyki w tle (z innej aplikacji, na przykład):
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil];
[[AVAudioSession sharedInstance] setActive:YES error:nil];
[[AVAudioSession sharedInstance] setDelegate:self];
Dobre spostrzeżenia. Dam im szansę w ten weekend i podziel się wynikami! –