2012-01-02 14 views
5

Sto creando uno strumento musicale per l'iPhone. Nella mia app quando tocco un CALayer suona una nota e il livello fa un movimento per la durata della nota.CABasic Problemi di lag anomalie con IOS 5 e RemoteIO

Questo era tutto perfettamente funzionante su iOS 4.1, tuttavia ho appena aggiornato a iOS 5.0.1 e ho riscontrato gravi problemi di lag se ho premuto più note in successione. Dopo molto dolore, l'ho ridotto al seguente codice di animazione per il CALayer che viene toccato.

// here is an example wiggle 
CABasicAnimation *wiggle = [CABasicAnimation animationWithKeyPath:@"transform"]; 
wiggle.duration = 0.1; 
//wiggle.repeatCount = 1e100f; 
wiggle.repeatCount = 100; 
wiggle.autoreverses = YES; 
wiggle.toValue = [NSValue valueWithCATransform3D:CATransform3DRotate(fret.fretLayer.transform,0.2, 0.0 ,1.0 ,2.0)]; //angle, x , y , z 
wiggle.fromValue = [NSValue valueWithCATransform3D:CATransform3DRotate(fret.fretLayer.transform,-0.2, 0.0 ,1.0 ,2.0)]; //angle, x , y , z 

// doing the wiggle 
[note.noteLayer addAnimation:wiggle forKey:@"wiggle"]; 

Se blocco l'ultima riga in cui l'animazione viene aggiunta al livello, tutto il ritardo scompare immediatamente. Sembra che il thread principale sia bloccato in qualche modo, o che non sia in esecuzione sul thread principale, ma ho provato a richiamare la funzione con performSelectorOnMainThread: withObject: waitUntilDone: NO e non ha fatto alcuna differenza. Se preme molto velocemente un sacco di note, l'intera app si interrompe, e dopo circa un secondo è come se si riprendesse da sola e improvvisamente tutto il suono suona e l'animazione finalmente inizia a essere mossa e soffocata.

Qualcuno sa di problemi insoliti con CABasicAnimation in iOS 5? C'è qualche API di animazione alternativa che potrei provare che potrebbe anche animare i CALayer per una durata non specificata in ripetizione? Qualcuno ha suggerimenti o supposizioni su come risolvere/da cosa potrebbe derivare il problema?

MODIFICA: Ho determinato che non ha assolutamente nulla a che fare con la natura dell'animazione. Ho sostituito il codice di wiggle con un codice che sfuma semplicemente il colore in questo modo, ma sto ancora ottenendo lo stesso effetto di ritardo con le note che sono laggose da riprodurre.

CABasicAnimation *wiggle = [CABasicAnimation animationWithKeyPath:@"backgroundColor"]; 
wiggle.duration = 2; 
wiggle.toValue = (id)[UIColor whiteColor].CGColor ; 
wiggle.fromValue = (id)[UIColor colorWithRed:0.1 green:0.2 blue:0.8 alpha:0.4].CGColor; 

Sospetto che potrebbe essere qualcosa a che fare con un cambiamento in CoreAudio/RemoteIO forse? E questo interferisce con il thread principale o viceversa?

risposta

1

Alla fine ha elaborato la vera natura di ciò che stava causando il problema. Risulta che c'è un problema nell'uso di shouldRasterize = YES in iOS 5.

Nella mia app sto incorporando 100+ CALayer in un UIView che ha avuto il suo layer impostato su shouldRasterize = YES. Ho creato una nuova app da zero e aggiunto bit fino a quando non ho replicato il problema. Alla fine è risultato essere questo. In iOS 4 questo non è un problema. In iOS 5 lo è. Se ruoto dovrebbe Rasterizzare il problema scompare immediatamente.

Hanno inviato un bug report con apple.

0

Solo per il test, provare a sostituire CABasicAnimation con [UIView beginAnimation/commitAnimation].

+0

Le animazioni di UIView funzionano su CALayer? Ho provato a scrivere il mio codice e ho anche provato ad usare la risposta più importante da qui: http://stackoverflow.com/questions/929364/how-to-create-iphones-wobbling-icon-effect ma entrambi hanno lo stesso effetto di apparentemente ignorando le funzioni e semplicemente eseguendo il codice fret.fretLayer.transform = CATransform3DMakeRotation (-0.2, 0.0, 1.0, 2.0) mentre lo passa (quindi eseguendolo solo una volta). Questa risposta dall'alto del collegamento che ho postato sembra utilizzare CGAffineTransform anziché CATransform3D ma non riesco a applicare CGAffineTransform direttamente a CALayers? Qualche idea? (Ps.thanks) – chopsalot