2009-02-27 51 views
2

我知道Core Animation在单独的线程中调度它的动画,正如文档中所述。不过,我的动画似乎阻止了我的主线。所有动画开始和芬兰语。 (有或没有kCATransactionDisableActions设置为true),但变得跳跃,主runloop摊位。如何防止Core Animation阻止我的主线程?

我在做什么错?

概念例如:

[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

备案:我们正在潜入OpenGL ES。 – Kriem 2009-03-02 21:29:41

回答

7

每秒创建30个新动画是一个非常糟糕的主意,而不是Core Animation如何使用。核心动画是围绕这样的想法设计的,即你告诉系统你希望你的图层(或图层背景视图)最终到达的位置,并且它会计算出剩下的部分,包括在你的时间范围内放下多少帧来运行动画提供。动画本身将运行在后台线程上,但我相信有一些设置需要首先在调用线程(通常是主线程)上执行。这种设置可能需要比1/30秒更长的时间,这会使主线程过载。

您的目标应该是尽量减少与Core Animation的交互量。如果您有一个复杂的脚本运动路径(或其他属性更改),请使用CAKeyframeAnimation提前完成设置,然后调用该动画一次。如果您的对象的运动有些东西需要根据用户输入进行更改,那么只有在获得实际输入时才会这样做。更改CALayer中间动画的属性将使其从当前运动路径的中间平滑移动到新目标。

如果以这种方式使用Core Animation,则可以同时在iPhone上以60 FPS动画显示50个移动半透明层。

1

既然你已经开始了动画30次我可以想象你在铺天盖地的系统。在发布新动画之前,以前的动画是否有时间开始?

+0

他们这样做。他们都开始芬兰语。 (有或没有将kCATransactionDisableActions设置为true。) 尽管如此,Core Animation不应阻止我的主循环。 – Kriem 2009-02-27 18:40:34