[英]OpenGL VSync / NSTimer issues on macOS
我试图建立在MacOS一个简单的OpenGL游戏,使用NSTimer
建立一个运行循环的解释在这里 。 我们的想法是创建一个具有非常小(~1ms)时间间隔的重复计时器,并依靠vsync来调节帧速率。
我将我的NSOpenGLContext
交换间隔设置为值1,这应该启用vsync。 我的印象是这会导致NSOpenGLContext.flushbuffer
被阻止,但似乎并非如此。 我的渲染代码比每秒60次更频繁地发射。
我链接的文档已被标记为已退役,但我读过的所有官方文档都表明可以以某种方式将NSTimer
循环限制为显示的刷新率。 我无法让这个工作,我想知道这种方法是否不再可行。
我错过了什么吗? 在现代项目中,使用CVDisplayLink
吗?
我的理解是, NSTimer
不太可能比每秒大约10-20次更频繁地发射,并且通过计时器合并,您不可能获得适合此类应用的保证开火时间。 例如, 这个问题的一个答案指出, 文档说:
由于典型的运行循环管理各种输入源,因此定时器的时间间隔的有效分辨率被限制在50-100毫秒的量级。 如果在长时间标注期间或在运行循环处于不监视计时器的模式下发生计时器的触发时间,则计时器在下次运行循环检查计时器之前不会触发。 因此,计时器可能发射的实际时间可能是在计划的发射时间之后的重要时间段。
CVDisplayLink
绝对是首选解决方案。 使用起来也很简单。
并回答你的另一个问题,是的,有些事情发生了变化。 操作系统改变了定时器的处理方式,以帮助提高能源性能。 我在一个应用程序上工作,使用你建议的方法直到OS 10.9或10.10。 一旦出现,我们不得不重新考虑我们的策略,因为计时器的工作方式不同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.