【问题标题】:How to disable vsync on macOS如何在 macOS 上禁用垂直同步
【发布时间】:2012-09-10 05:18:58
【问题描述】:

对于我所有的 SDL/OpenGL 程序,帧速率都停留在 60fps,因此看起来垂直同步已启用,但不是由我启用,也不是在我的代码或我的设置中。所以我想现在是否有办法禁用它,也许是在一些深层的 macOS 设置中?

【问题讨论】:

    标签: macos opengl sdl vsync


    【解决方案1】:

    这使我能够在我的 MacBook Pro 上获得大约每秒 700 帧。

    它也不是永久性的,非常适合测试/基准测试。

    Source

    【讨论】:

    • 天哪,毕竟这么久!!非常感谢朋友!
    • 我试过了,但什么也没发生。我做错了什么?
    • 1.仔细检查您正在测试的应用程序实际上可以超过 60fps; 2. 此解决方案适用于 Mavericks 10.9,未针对 Yosemite 或 El Capitan 进行测试
    • 你介意在你的回答中说明这个解决方案实际上不适用于 10.11 和 xCode 7.3(我唯一尝试过的那个)吗?
    • 你的第一个链接坏了:上面写着Your session has expired. Please log in.
    【解决方案2】:

    欢迎来到 SO。我为类似的问题概述了一种方法here。您应该考虑到大多数 Mac LCD 被锁定为 60Hz,而最近的硬件被限制为 120Hz。禁用 vsync 可能只会导致 CPU/GPU 周期的浪费,并可能引入撕裂伪影。

    【讨论】:

    • 是的,我已经不再四处寻找解决方案了...谢谢!
    【解决方案3】:

    经过多年寻找解决方法(并在 Brett Hale 的帮助下),这对我有用 - 我在渲染循环的开头添加了那段代码(不仅在 init 中,如Apple 似乎每次都重置 SwapInterval 设置...) 并最终能够使帧率不同步:

    #ifdef __APPLE__
    GLint                       sync = 0;
    CGLContextObj               ctx = CGLGetCurrentContext();
    
    CGLSetParameter(ctx, kCGLCPSwapInterval, &sync);
    #endif
    

    别忘了包含<OpenGL/gl.h>

    这不是最好的解决方案,但它实际上是我发现的唯一一个像魅力一样工作的解决方案。

    【讨论】:

    • 显然这在 Mac OS 10.14 (Mojave) 中被破坏了,始终禁用 vsync,(但 Metal 中的 vsync 仍然有效)。 SDL2.0.10+(尚未发布)将通过使用 CVDisplayLink 来解决此错误。你可以看到commit herediscussion here
    • 另外,SDL2 以前使用的代码似乎只设置了一次,而不是每一帧。也许是因为他们改为调用[NSOpenGLContext setValues:&value forParameter:NSOpenGLCPSwapInterval]
    • 确认在 macOS 10.14 上工作,但似乎这不再在 macOS 10.15 和 11 上工作,我试过 kCGLCPSwapInterval / NSOpenGLCPSwapInterval / CVDisplayLink
    • 在macOS 10.15和11上发现,包括flushBuffer()在内的实际绘图代码一定不能放在func draw(_ dirtyRect: NSRect)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多