NSOpenGLView 重绘的速度有多快?它有默认的 FPS 吗?

How fast does NSOpenGLView redraw? Does it have a default FPS?

我正在 Xcode 6 中创建一个 Cocoa 应用程序,该应用程序使用 OpenGLView。我的 NSOpenGLView 扩展中的 draw 方法被重复调用,但我不确定它被调用的速率或设置速率的方法。

NSOpenGLView 是否有默认值 "framerate",有没有办法更改它?

通常在任何 window 系统中,window 不会定期重绘;它仅在响应导致 “损坏”“脏” 状态的事件时发生。

导致这种“损坏”状态的事情的数量近年来已经减少了很多,这要归功于 window 经理(OS X使用一位这样的 window 经理)。它曾经在 window 移到它上面时发生,但在现代 window 管理器中它只发生 during/after 调整大小事件或当 window 被移动时。

如您所料,Cocoa 的文档说明了同样的事情:

- update

Called by Cocoa when the view’s window moves or when the view itself moves or is resized.


Owen Taylor 写了一篇 excellent blog;此图说明了可能发生的情况:

If a compositor isn’t redrawing immediately when it receives damage from a client, but is waiting a bit for more damage, then it’s possible it might wait too long and miss the vertical reblank entirely. Then the frame rate could drop way down, even if there was plenty of CPU and GPU available.

Apple has a technote 描述如何驱动 OpenGL 渲染循环。答案是使用CoreVideo显示link(CVDisplayLink),它会在消隐间隔期间调用回调。