我知道Core Animation在一个单独的线程中调度其动画,如文档中所述。然而,我的动画似乎阻止了我的主线程。所有动画开始和芬兰。 (有或没有kCATransactionDisableActions设置为true。)但是变得跳跃并且主runloop停止。
我做错了什么?
概念示例:
[NSTimer scheduledTimerWithTimeInterval:0.0333 target:self selector:@selector(gameEngine) userInfo:nil repeats:YES];
- (void)gameEngine
{
[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
myLayer.position = CGPointMake( newX, newY);
[CATransaction commit];
}
答案 0 :(得分:7)
每秒创建30个新动画是一个非常糟糕的主意,而不是如何使用Core Animation。 Core Animation的设计理念是告诉系统你想要你的图层(或图层支持的视图)结束的位置,然后它会计算出其余部分,包括在你的时间范围内运行动画需要多少帧提供。动画本身将在后台线程上运行,但我相信有一些需要首先执行的设置,它发生在调用线程(通常是主线程)上。此设置可能需要超过1/30秒,这会使主线程过载。
您的目标应该是尽量减少与Core Animation的互动量。如果您有一个复杂但脚本化的运动路径(或其他属性更改),请使用CAKeyframeAnimation提前设置它,然后只调用该动画一次。如果对象的运动需要根据用户输入进行更改,那么只有在获得实际输入时才会这样做。更改CALayer中间动画的属性将使其平滑地从当前运动路径的中间移动到新目的地。
如果您以这种方式使用Core Animation,您可以同时在iPhone上以60 FPS动画最多50个移动半透明图层。
答案 1 :(得分:1)
鉴于你每秒开始动画30次,我想你会压倒系统。以前的动画在发布新动画之前是否还有时间开始?