当前位置:  开发笔记 > IOS > 正文

如何阻止Core Animation阻止我的主线程?

如何解决《如何阻止CoreAnimation阻止我的主线程?》经验,为你挑选了1个好方法。

我知道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个移动半透明层.



1> Brad Larson..:

每秒创建30个新动画是一个非常糟糕的主意,而不是如何使用Core Animation.Core Animation的设计理念是告诉系统你想要你的图层(或图层支持的视图)结束的位置,然后它会计算出其余部分,包括在你的时间范围内运行动画需要多少帧提供.动画本身将在后台线程上运行,但我相信有一些需要首先执行的设置,它发生在调用线程(通常是主线程)上.此设置可能需要超过1/30秒,这会使主线程超载.

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

如果您以这种方式使用Core Animation,您可以同时在iPhone上以60 FPS动画最多50个移动半透明层.

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有