2012-01-02 8 views
5

Estoy creando un instrumento musical para el iPhone. En mi aplicación, cuando toco un CALayer, se reproduce una nota y la capa se mueve durante toda la nota.CABasicAnimation lag issues con IOS 5 y RemoteIO

Todo estaba funcionando perfectamente en iOS 4.1, sin embargo, acabo de actualizar a iOS 5.0.1 y experimenté problemas importantes de latencia si presioné varias notas seguidas. Después de mucho dolor lo he reducido al siguiente código de animación de meneo para el CALayer que se toca.

// 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"]; 

Si bloqueo la última línea donde se agrega la animación a la capa, todo retraso desaparece inmediatamente. Parece que el hilo principal está siendo bloqueado de alguna manera, o no se está ejecutando en el hilo principal, pero he intentado invocar la función con performSelectorOnMainThread: withObject: waitUntilDone: NO y no hizo ninguna diferencia. Si presiono muchas notas rápidamente, toda la aplicación hace una pausa, y luego, un segundo más tarde, es como si se recuperara y, de repente, todo el sonido se reproduce y la animación finalmente comienza a ser entrecortada y ahogada después de eso.

¿Alguien sabe de algún problema inusual con CABasicAnimation en iOS 5? ¿Hay alguna API de animación alternativa que pueda probar que también pueda animar CALayers durante un tiempo no especificado al repetir? ¿Alguien tiene alguna sugerencia o suposición sobre cómo arreglar/de qué podría provenir el problema?

EDIT: He determinado que definitivamente no tiene nada que ver con la naturaleza de la animación. Reemplacé el código de meneo con un código que simplemente desvanece el color de esa manera, pero todavía estoy obteniendo el mismo efecto de retardo con las notas gastadas para jugar.

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; 

¿Sospecho que podría ser algo relacionado con un cambio en CoreAudio/RemoteIO quizás? ¿Y eso está interfiriendo con el hilo principal o viceversa?

Respuesta

1

Finalmente resuelto la verdadera naturaleza de lo que estaba causando el problema. Resulta que hay un problema con el uso de shouldRasterize = YES en iOS 5.

En mi aplicación, estoy incorporando más de 100 CALayers en una UIView que tiene su capa establecida en shouldRasterize = YES. Creé una nueva aplicación desde cero y agregué bits hasta que repliqué el problema. Finalmente resultó ser esto. En iOS 4 esto no es un problema. En iOS 5 es. Si desactivo el uso deRastimensionamiento, el problema desaparece inmediatamente.

He enviado un informe de error con Apple.

0

Para prueba, intente reemplazar CABasicAnimation con [UIView beginAnimation/commitAnimation].

+0

¿Funcionan las animaciones UIView en CALayers? Traté de escribir mi propio código y también intenté usar la respuesta superior desde aquí: http://stackoverflow.com/questions/929364/how-to-create-iphones-wobbling-icon-effect pero ambos tienen el mismo efecto de ignorar aparentemente las funciones y simplemente ejecutando el código fret.fretLayer.transform = CATransform3DMakeRotation (-0.2, 0.0, 1.0, 2.0) a medida que pasa sobre él (por lo que solo lo ejecuta una vez). ¿Cuál respuesta superior del enlace que publiqué parece usar CGAffineTransform en lugar de CATransform3D pero no puedo aplicar CGAffineTransform directamente a CALayers? ¿Alguna idea? (Ps.gracias) – chopsalot