我基本上想要做的是以快速(60 /秒)显示一系列图像以创建序列。我打算创建一个计时器,看看它是否足够快。
我想使用动画在我的可可应用程序中显示一组图像(每秒最多60个)。
这是我到目前为止创建的动画:
- (CAAnimation*)imageAnimation;
{
CGImageRef image1 = [self nsImageToCGImageRef:[NSImage imageNamed:@"1.png"]];
CGImageRef image2 = [self nsImageToCGImageRef:[NSImage imageNamed:@"2.png"]];
CGImageRef image3 = [self nsImageToCGImageRef:[NSImage imageNamed:@"3.png"]];
CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
NSArray *images = [NSArray arrayWithObjects:(id)image1, (id)image2, (id)image3, nil];
[animation setValues:images];
[animation setDuration:3.0];
return animation;
}
其中nsImageToCGImageRef
是我在其他地方定义的方法。现在,我不知道从这里开始将这个动画添加到我的视图中。
答案 0 :(得分:2)
您应该调查CVDisplayLink
,这样每次Mac的显示子系统即将显示一个帧时,您都可以收到回调。这样可以让您以60fps的速度显示图像而不会丢帧,因为API只在需要更新时调用您的代码。
这意味着您无需担心计时器与显示器同步,这也意味着您没有做不必要的工作。如果您的绘图代码很慢,您还可以执行诸如仅在备用回调上更新以将帧速率降低到30fps的事情。
答案 1 :(得分:0)
嗯,首先,问题不够明确。您可能想要改写,因为问题没有说明您想要实现的目标,并且没有说明您迄今为止使用代码所做的事情。
CAKeyframeAnimation用于指定动画期间图层属性的值。
您正在创建具有属性位置的关键帧动画;在这种情况下,您应该在动画期间给出要设置的图层的位置值。您正在尝试更改图像。从我的代码中可以理解,您应该使用图像值设置内容属性而不是动画属性,但是您将无法获得平滑的动画。我自己没有尝试过,但基于理论,它需要什么。你的代码是否正常工作?即使它很慢,我也不这么认为你需要的方式?如果将消息animationWithKeyPath的属性名称“position”更改为“contents”,即使它的速度很慢,请告诉我吗?
你需要有一个纹理的地图集。请查看网址http://mysterycoconut.com/blog/2011/01/cag1/
根据您在问题中可以理解的内容,这可能会显示您的需求。
答案 2 :(得分:0)
经过一些研究和试验后,似乎最好的方法是使用计时器,然后使用下一个可用的图像更改图像。