如何防止Core Animation阻塞主线程?

3

我知道Core Animation在单独的线程中分发其动画,如文档所述。然而,我的动画似乎阻塞了我的主线程。所有动画都会启动和结束(kCATransactionDisableActions设置为true或false皆是如此),但却变得不稳定,主运行循环停滞。

我做错了什么?

示例:

[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];    
}

记录一下:我们要深入了解OpenGL ES。 - Kriem
2个回答

8
每秒创建30个新动画是一个非常糟糕的想法,也不是Core Animation的预期使用方式。Core Animation的设计理念是告诉系统您想要将图层(或带有图层支持的视图)放在哪里,它会计算出剩余的部分,包括在提供的时间范围内运行动画所需丢弃的帧数。这些动画本身将在后台线程上运行,但我相信首先需要执行一些设置,这些设置将在调用线程(通常是主线程)上进行。这个设置可能需要比1/30秒更长的时间,这将使您的主线程超载。
您的目标应该是最小化与Core Animation的交互量。如果您有一个复杂但脚本化的运动路径(或其他属性更改),请使用CAKeyframeAnimation提前设置好所有内容,并只调用该动画一次。如果您的对象的运动中有需要根据用户输入进行更改的内容,请在实际输入时才执行更改操作。更改CALayer的属性会导致它平滑地从其当前运动路径的中间移动到其新目的地。
如果以这种方式使用Core Animation,则可以在iPhone上同时以60 FPS动画显示多达50个移动半透明图层。

1

假设您每秒开始30次动画,我想您可能会使系统不堪重负。在发出新动画之前,之前的动画是否有时间开始?


他们都会开始和结束(无论是否设置为kCATransactionDisableActions为true)。尽管如此,核心动画不应该阻塞我的主运行循环。 - Kriem
如果CA被压垮,你的主循环确实可能会阻塞。线程并不是具有无限资源的魔法物品。 - Andrew Grant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接