仅在绘图完成后调用功能

时间:2015-06-01 16:10:33

标签: macos swift

我正在使用设置为每02秒更新一次的计时器在NSView上绘图。在更新时,一些物理模拟会迈出一步,然后Canvas!.needsDisplay = true。它适用于应用程序处于前台(通常),但是当发生一些滞后时,尽管视图还没有反映出来,但模拟仍然向前推进。如何在这些时间暂停计时器,以便仅在NSView可以显示时才进行模拟?我不想从step_over内部调用drawRect,因为这似乎是一个坏主意,因为那样停止模拟会更难。

1 个答案:

答案 0 :(得分:0)

通常,这种更新应该以相反的方式完成,方法是让显示器询问您是否可以显示帧。这是通过 CADisplayLink CVDisplayLink完成的(这是Mac; CADisplayLink是iOS)。使用您可以在绘制框架时调用的方法对其进行配置。

通常你希望你的模拟继续前进,即使它意味着偶尔丢帧。为此,您检查时间戳并使用它来计算新帧的使用时间。但是如果您只想在显示器显示时向前移动,那么每次通话只需更新一次。

请注意,以50fps的速度生成通常会与尝试以60fps绘制的系统不匹配,因此您偶尔会结束丢失的帧。这是不尝试使用计时器进行绘图的几个原因之一。

另见Alternative of CADisplayLink for Mac OS X。请注意,尝试使用Core Graphics以50fps绘制通常不会在任何情况下都能提供良好的结果。 OS X中的正确工具是Core Animation(或10.10上的游戏的SpriteKit,或更高级的高速渲染的OpenGL)。您可以使用NSTimer执行非常基本的动画(我们在Core Animation出现之前已做了多年),但它并不是复杂绘图的工具。

相关问题