CABasicAnimation与IOS 5和RemoteIO的滞后问题
我正在为iPhone创建乐器。在我的应用程序中,当我触摸CALayer时,会弹奏一个音符,该音符在音符的持续时间内会发生摆动。CABasicAnimation与IOS 5和RemoteIO的滞后问题
这完全在iOS 4.1上运行,但是我刚刚升级到iOS 5.0.1,并且如果我连续按下多个笔记,则会遇到主要滞后问题。在经历了很多痛苦后,我将其缩小到了所触摸的CALayer的以下摆动动画代码。
// 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"];
如果我屏蔽掉的最后一行,其中动画被添加到层中的所有滞后立即消失。感觉主线程以某种方式被阻塞,或者它不在主线程中运行,但是我尝试用performSelectorOnMainThread调用函数:withObject:waitUntilDone:NO,它没有任何区别。如果我真的很快地按下大量的音符,整个应用程序就会暂停,然后一秒钟左右它就会跟上它自己,突然间所有的声音都会播放,并且动画终于开始全部断断续续,然后戛然而止。
有谁知道iOS 5中的CABasicAnimation有什么不寻常的问题吗?有没有其他的动画API可以尝试,也可以使CALayers在未指定的时间内重复动画?任何人有任何建议或猜测如何解决/问题可能源于什么?
编辑: 我确定这绝对与动画的本质无关。我用简单地淡化颜色的代码取代了摆动代码,但是我仍然得到相同的滞后效果,而音符很难播放。
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;
怀疑这可能与CoreAudio/RemoteIO的变化有关吗?这是干扰主线程还是反过来呢?
终于找出了导致问题的真正原因。结果在iOS 5中使用shouldRasterize = YES时出现问题。
在我的应用程序中,我将100多个CALayers嵌入到UIView中,其图层设置为shouldRasterize = YES。我从头开始创建了一个新应用程序,并添加了一些内容,直到我复制了问题。最终它变成了这个。在iOS 4中,这不是一个问题。在iOS 5中是这样的。如果我打开shouldRasterize,问题会立即消失。
已经向苹果提交了一个错误报告。
只是为了测试,尝试用[UIView beginAnimation/commitAnimation]替换CABasicAnimation。
UIView动画是否适用于CALayers?我试图写我自己的代码,并尝试使用从这里顶部的答案:http://stackoverflow.com/questions/929364/how-to-create-iphones-wobbling-icon-effect但都具有相同的效果,似乎忽略这些函数只是运行在它通过它的代码(因此只运行一次)中。fret.fretLayer.transform = CATransform3DMakeRotation(-0.2,0.0,1.0,2.0) 代码。 从我发布的链接的顶部答案似乎使用CGAffineTransform而不是CATransform3D,但我似乎不能将CGAffineTransform直接应用于CALayers? 有什么想法?(ps.thanks) – chopsalot 2012-01-14 19:41:11