Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Cocoa中每帧绘制一次_Cocoa_Drawing_Frame_Sync - Fatal编程技术网

在Cocoa中每帧绘制一次

在Cocoa中每帧绘制一次,cocoa,drawing,frame,sync,Cocoa,Drawing,Frame,Sync,当我使用GLUT时,我可以提供一个回调函数,每个帧调用一次以生成或设置帧内容的动画 我如何对可可做同样的事情 我知道有setNeedsDisplay,但我不知道如何避免每帧调用它不止一次。我需要的是一个事件或其他回调,告诉我何时绘制另一帧。Cocoa中的所有内容都已缓冲,因此您可以在不重新绘制视图的情况下移动、设置动画和调整视图。如果需要反复重画视图(例如,反复调用drawRect:并创建自己的动画),则需要创建一个计时器,该计时器每1/20秒触发一次,并触发视图刷新 您可以创建如下计时器: [

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

我如何对可可做同样的事情


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

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的所有视图都将被重新绘制


希望有帮助

它实际上只是取决于你需要多快的速度来设置你的视图的动画。帧速率为24或30 fps可能更好,这取决于您需要动画的平滑程度。好吧,我希望它与视频刷新率完全相同,因此它尽可能平滑,而无需计算不必要的帧。有没有一种方法可以让每个视频帧都有一次计时器回调?啊-我知道你现在想做什么了!不幸的是,我不太了解这一点——我从来没有搞过帧同步。不过,苹果OpenGL编程指南的第125页似乎谈到了这一点:。祝你好运