如何在macOS上禁用垂直同步

15

在我所有使用SDL/OpenGL编写的程序中,帧率都被限制在60fps,看起来像是垂直同步已启用,但既不是由我控制,也不在我的代码或设置中。因此,我想知道是否有一种方法可以禁用它,也许在某些深层macOS设置中?

3个回答

9
这使我在我的MacBook Pro上达到了约700帧每秒的速度。

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

来源


1
哦,我的天啊,终于等到这一刻了!非常感谢你,伙计! - Nox
我尝试了这个,但什么也没发生。我做错了什么? - Kalamalka Kid
  1. 请仔细检查您正在测试的应用程序是否能够实际达到60fps以上;
  2. 该解决方案适用于Mavericks 10.9版本,未经过Yosemite或El Capitan的测试。
- cevaris
1
您介意在您的答案中说明一下,这个解决方案实际上在10.11和xCode 7.3(这是我唯一尝试过的版本)上已经不再有效了吗? - Nox
你的第一个链接已经失效了:它显示“您的会话已过期,请登录。”。 - Ruslan

5

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


是的,我已经停止寻找解决方案了...不过还是谢谢你! - Nox

5

多年来一直在寻找解决方法(在Brett Hale的帮助下),这是对我有效的方法 - 我将这段代码添加到我的渲染循环的开头(而不仅仅是在初始化中,因为苹果似乎每次都会重置SwapInterval设置...),最终成功实现了不同步的帧率:

#ifdef __APPLE__
GLint                       sync = 0;
CGLContextObj               ctx = CGLGetCurrentContext();

CGLSetParameter(ctx, kCGLCPSwapInterval, &sync);
#endif

不要忘记包含<OpenGL/gl.h>

虽然不是最好的解决方案,但这是我找到的唯一一个完美运行的方法。


已确认在macOS 10.14上工作正常,但似乎在macOS 10.15和11上不再起作用了。我尝试过kCGLCPSwapInterval / NSOpenGLCPSwapInterval / CVDisplayLink - vk.edward.li
发现在 macOS 10.15 和 11 上,实际的绘图代码包括 flushBuffer() 不应该放在 func draw(_ dirtyRect: NSRect) 中。 - vk.edward.li
可能是一个简单的问题,但我应该在哪里执行这段代码?我已经尝试在终端和Xcode中执行了。 - Mustafa Iqbal
我按照这里的说明进行操作:https://www.reddit.com/r/applehelp/comments/5bb0db/how_to_unlock_the_fps_on_a_macosdisable_vsync/,但是使用上述代码时出现了几个错误。在 GitHub 上搜索后发现,在 Mac OS 12.2 中禁用 VSync 存在问题。 - Mustafa Iqbal
@MustafaIqbal 这段代码应该放在你开发应用程序时的渲染循环中(我使用的是C++)。请注意,它只会影响你的应用程序,而不是共享设置。 - Nox
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接