每毫秒更新一次NSView帧

Pet*_*ete 2 macos graphics cocoa frame nsview

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

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

ipm*_*mcc 7

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

如果您只是想移动视图(并且您不需要重绘它),您可以尝试调用-setFrameOrigin并使用Layer支持的视图.我希望AppKit/CoreAnimation能够在<1/60秒内轻松地重新定位一个支持图层的视图(无需重新光栅化)(轻松实现).

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

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