Macos 仅在绘图完成后调用函数
我正在使用设置为每.02秒更新一次的计时器在Macos 仅在绘图完成后调用函数,macos,swift,Macos,Swift,我正在使用设置为每.02秒更新一次的计时器在NSView上绘图。在更新时,一些物理模拟会执行一个步骤,然后Canvas!。needsDisplay=true。当应用程序在前台时(通常),它可以工作,但当一些延迟发生时,模拟会向前推进,尽管视图还没有反映出来。如何在这些时间暂停计时器,使模拟仅在NSView可以显示时发生?我不想从内部调用step_over,因为这似乎是个坏主意,因为这样会更难停止模拟。通常,这种更新应该以另一种方式完成,让显示器询问您可以显示的帧。这是通过CADisplayLin
NSView
上绘图。在更新时,一些物理模拟会执行一个步骤,然后Canvas!。needsDisplay=true
。当应用程序在前台时(通常),它可以工作,但当一些延迟发生时,模拟会向前推进,尽管视图还没有反映出来。如何在这些时间暂停计时器,使模拟仅在NSView
可以显示时发生?我不想从内部调用step_over
,因为这似乎是个坏主意,因为这样会更难停止模拟。通常,这种更新应该以另一种方式完成,让显示器询问您可以显示的帧。这是通过CADisplayLink
CVDisplayLink
完成的(这是Mac;CADisplayLink
是iOS)。使用您希望在可以绘制框架时调用的方法对其进行配置
通常,您确实希望模拟继续向前移动,即使这意味着偶尔会删除帧。为此,您需要检查时间戳,并使用该时间戳计算出新帧的使用时间。但是,如果您只想在屏幕显示时向前移动,那么每次通话只需更新一次
请注意,以50fps的速度生成通常会与尝试以60fps的速度绘制的系统不匹配,因此偶尔会出现缺少帧的情况。这是不尝试使用计时器推送绘图的几个原因之一
另见。请注意,尝试以50fps的速度绘制核心图形在任何情况下都不会产生好的效果。OSX中的正确工具是核心动画(或10.10游戏的SpriteKit,或更高级的高速渲染的OpenGL)。你可以用
NSTimer
制作非常基本的动画(在核心动画出现之前我们已经做了很多年),但它并不是一个真正用于复杂绘图的工具。我的模拟和显示是由计时器推动的。因此,m simulation可以保持推送状态,CADisplayLink
应该负责绘图?反之亦然<代码>CADisplayLink告诉您屏幕何时可以绘制。您的显示器不是由计时器推动的。当显示器绘制时,显示器就会绘制(这与50fps并不完全匹配)。你只是将“下次你想画画的时候我想画画”标记为每秒50帧。您的用例看起来很奇怪。为什么仅仅因为需要删除帧就要延迟模型模拟?那会在视觉上结巴。没有人保证你的计时器能精确地以50fps的速度启动(NSTimer只是保证不会比你要求的快)。(顺便说一句,你为什么要尝试手动制作动画?iOS有几个优秀的动画库,针对最常见的问题进行了优化。)这个程序是针对OS X的,这是我的第一次体验。我还不想包括任何库,我只想学习swift和GUI编程的工作原理。而且,显然,OSX没有CADisplayLink