我知道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]; }
Brad Larson.. 7
每秒创建30个新动画是一个非常糟糕的主意,而不是如何使用Core Animation.Core Animation的设计理念是告诉系统你想要你的图层(或图层支持的视图)结束的位置,然后它会计算出其余部分,包括在你的时间范围内运行动画需要多少帧提供.动画本身将在后台线程上运行,但我相信有一些需要首先执行的设置,它发生在调用线程(通常是主线程)上.此设置可能需要超过1/30秒,这会使主线程超载.
您的目标应该是尽量减少与Core Animation的交互量.如果您有一个复杂但脚本化的运动路径(或其他属性更改),请使用CAKeyframeAnimation提前设置它,然后只调用该动画一次.如果对象的运动需要根据用户输入进行更改,那么只有在获得实际输入时才会这样做.更改CALayer中间动画的属性将使其从当前运动路径的中间平滑移动到新目标.
如果您以这种方式使用Core Animation,您可以同时在iPhone上以60 FPS动画最多50个移动半透明层.
每秒创建30个新动画是一个非常糟糕的主意,而不是如何使用Core Animation.Core Animation的设计理念是告诉系统你想要你的图层(或图层支持的视图)结束的位置,然后它会计算出其余部分,包括在你的时间范围内运行动画需要多少帧提供.动画本身将在后台线程上运行,但我相信有一些需要首先执行的设置,它发生在调用线程(通常是主线程)上.此设置可能需要超过1/30秒,这会使主线程超载.
您的目标应该是尽量减少与Core Animation的交互量.如果您有一个复杂但脚本化的运动路径(或其他属性更改),请使用CAKeyframeAnimation提前设置它,然后只调用该动画一次.如果对象的运动需要根据用户输入进行更改,那么只有在获得实际输入时才会这样做.更改CALayer中间动画的属性将使其从当前运动路径的中间平滑移动到新目标.
如果您以这种方式使用Core Animation,您可以同时在iPhone上以60 FPS动画最多50个移动半透明层.