我正在尝试在MacOS上设置一个简单的OpenGL游戏,使用一个NSTimer来设置一个运行循环,如here所述。其思想是创建一个具有非常小(~1毫秒)时间间隔的重复计时器,并依靠垂直同步来调节帧速率。
我将交换间隔设置为1,这将启用垂直同步。我的印象是这会导致NSOpenGLContext阻塞,但情况似乎并非如此。我的渲染代码每秒触发的频率要高出60次。
我链接的文档已标记为失效,但我读过的所有正式文档都表明,可以通过某种方式将NSOpenGLContext.flushbuffer循环限制到显示器的刷新率。不过,我还没能让这种方法发挥作用,我想知道这种方法是否不再可行。
我错过什么了吗?在一个现代项目中,仅仅使用一个NSTimer更好吗?

最佳答案

我的理解是,NSTimer不太可能比每秒10-20次更频繁地触发,并且通过计时器合并,您不太可能获得适合此类型应用程序的保证触发时间。例如,one answer to this question指出,docs说:
由于典型的运行循环管理的各种输入源,计时器时间间隔的有效分辨率限制在50-100毫秒之间。如果计时器的触发时间发生在长调用期间,或者运行循环处于不监视计时器的模式,则在下次运行循环检查计时器之前,计时器不会触发。因此,定时器可能触发的实际时间可能是预定触发时间之后的一段重要时间。
CVDisplayLink绝对是首选解决方案。使用起来也很简单。
为了回答你的另一个问题,是的,有些事情已经改变了。操作系统改变了计时器的处理方式,以帮助提高能源性能。我在一个应用程序上使用了你建议的方法,直到10.9或10.10操作系统。一旦出现这种情况,我们必须重新考虑我们的策略,因为计时员的工作方式不同。

09-07 05:48
查看更多