在Cocoa每帧画一次

时间:2009-06-27 18:28:01

标签: cocoa drawing frame sync

当我使用GLUT时,我可以提供一个回调函数,每帧调用一次以生成帧内容或为其设置动画。

如何使用Cocoa做同样的事情?

我知道有setNeedsDisplay,但我不知道如何避免每帧调用多次。我需要的是一个事件或其他回调,告诉我何时绘制另一帧。

1 个答案:

答案 0 :(得分:3)

Cocoa中的所有内容都是缓冲的,因此您可以移动,动画和调整视图,而无需重新绘制视图。如果你需要反复重绘一个视图(例如,重复调用drawRect:并创建自己的动画),你需要创建一个每1/20秒触发一次的计时器并触发视图的刷新。

你可以创建一个这样的计时器:

[NSTimer scheduledTimerWithTimeInterval:1.0/20.0 target:self selector:@selector(animate) userInfo:nil repeats:YES];

您的回调函数(在本例中为“animate”)将如下所示。如果你的动画需要业务逻辑,你应该把它放在这里。但是,所有绘图都需要在视图的drawRect函数中完成。

- (void)animate {
    [animatedView setNeedsDisplay: YES];
} 

每帧多次调用setNeedsDisplay是安全的。 SetNeedsDisplay在视图上设置一个标志,并不实际执行任何绘图。当您的代码执行并且应用程序返回到主运行循环时,将重新绘制setNeedsDisplay = YES的所有视图。

希望有所帮助!