Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.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
Macos 仅在绘图完成后调用函数_Macos_Swift - Fatal编程技术网

Macos 仅在绘图完成后调用函数

Macos 仅在绘图完成后调用函数,macos,swift,Macos,Swift,我正在使用设置为每.02秒更新一次的计时器在NSView上绘图。在更新时,一些物理模拟会执行一个步骤,然后Canvas!。needsDisplay=true。当应用程序在前台时(通常),它可以工作,但当一些延迟发生时,模拟会向前推进,尽管视图还没有反映出来。如何在这些时间暂停计时器,使模拟仅在NSView可以显示时发生?我不想从内部调用step_over,因为这似乎是个坏主意,因为这样会更难停止模拟。通常,这种更新应该以另一种方式完成,让显示器询问您可以显示的帧。这是通过CADisplayLin

我正在使用设置为每.02秒更新一次的计时器在
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