2

我试图每毫秒更新一个 NSView 的帧。它适用于某些帧,但会很快阻塞。

我应该怎么做才能顺利更新?

4

1 回答 1

7

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

如果您尝试简单地移动视图(并且您不需要重绘它),您可以尝试调用-setFrameOrigin和使用基于图层的视图。我希望 AppKit/CoreAnimation 能够在不到 1/60 秒的时间内(轻松)重新定位支持图层的视图(无需重新光栅化)。

如果您想要简单地重新定位视图的更复杂的事情,并且您希望它以最大帧速率(同样,60FPS)发生,您可能会想要使用 OpenGL。

但实际上,这里的关键信息是“不要试图每秒做 1000 次事情”。当调用 Leap Motion 委托方法时,更新视图的位置,并让 WindowServer 以自己的速度完成其余的工作。

于 2013-08-14T14:00:24.397 回答