每毫秒更新一次NSView帧

时间:2013-08-14 13:33:14

标签: macos cocoa graphics frame nsview

我正在尝试每毫秒更新一次NSView的帧。它适用于某些帧,但它很快就会阻塞。

我该怎样做才能顺利更新?

1 个答案:

答案 0 :(得分:7)

WindowServer只会以最高60FPS的速度更新屏幕(除非你用Quartz Debug关闭它,但一般来说,它将限制在60FPS,并且永远不会为1000FPS )。试图强迫重绘比这更浪费是浪费精力。我希望,在正常情况下,在NSView上调用-setFrame:将导致-setNeedsDisplay:被调用,这意味着您的视图将在下次WindowServer绘制框架时重新绘制,所以即使您和#39;每秒1000次调用-setFrame:,它不会每秒1000次绘制你的视图。如果您看到口吃,我敢打赌,实际发生的事情是您的视图需要超过1/60秒才能重绘。在< 1/60秒内完成任何非平凡的光栅绘制(即你在-[NSView drawRect:]中所做的那种)很难。

如果您尝试简单地移动视图(并且不需要重新绘制视图),则可以尝试调用-setFrameOrigin并使用支持图层的视图。我希望AppKit / CoreAnimation能够在<1/60秒(轻松)中重新定位图层支持的视图(无需重新栅格化)。

如果你想要一些更复杂的东西,简单地重新定位一个视图,并且你希望它以最大帧速率(再次,60FPS)发生,你可能会想要研究使用OpenGL。

但实际上,这里的带回家信息是&#34;不要每秒尝试1000次。&#34;调用Leap Motion委托方法时,请更新视图的位置,让WindowServer按照自己的进度完成剩下的工作。