我正在尝试编写一个应用程序来全屏显示视频,该视频需要尽可能流畅。
我的 OpenGL 代码与垂直刷新同步同步,并且大部分时间播放流畅且 CPU 使用率低。
但是,有时会有轻微的口吃。
为了简化测试并消除潜在的延迟源,我编写了一个简单的渲染循环,它只创建一个全屏、清除帧并交换缓冲区。
我对缓冲区交换时间进行了计时(使用 mach_absolute_time() )并打印了 15 到 18 毫秒范围之外的时间。
下面显示了一个示例运行(报告时间以秒为单位,帧时间以毫秒为单位):
at time:0.903594 -> frame time:06.943 ms
at time:1.941287 -> frame time:20.801 ms
at time:1.956124 -> frame time:14.725 ms
at time:1.969766 -> frame time:13.533 ms
at time:4.059608 -> frame time:23.808 ms
at time:4.068953 -> frame time:09.255 ms
at time:6.090000 -> frame time:55.086 ms
at time:6.090681 -> frame time:00.210 ms
at time:6.101372 -> frame time:10.659 ms
at time:9.684669 -> frame time:18.014 ms
at time:15.032867 -> frame time:18.463 ms
at time:15.047580 -> frame time:14.618 ms
at time:17.028749 -> frame time:65.096 ms
at time:17.028962 -> frame time:00.108 ms
at time:17.037022 -> frame time:08.034 ms
at time:17.049193 -> frame time:12.069 ms
at time:17.063416 -> frame time:14.130 ms
在测试时没有其他应用程序从 XCode 运行 appart。测试在运行 OS X 10.7.5 的 Macbook Pro 5,1 上运行。
切换图形(这台笔记本电脑有 Nvidia 9600 和 9400),从外接显示器或笔记本电脑屏幕运行没有区别。
为了排除底层 API 之间的差异,我使用 SDL、Glfw、Cinder 和 SFML 等图形框架尝试了相同的代码。最后,我还尝试了官方 Apple OpenGL 全屏示例的计时。它们的行为或多或少都相同,尽管 Glfw 似乎更稳定一些。
使用 SCHED_FIFO 策略将绘图线程优先级提高到最大值似乎可以改善一点,但效果不大。
我开始认为不可能从 OpenGL 获得稳定的 60hz 帧速率,或者如果是,那么它没有正确记录。
有没有人能够在 OS X 中为全屏 OpenGL 应用程序获得稳定的 60hz 显示速率?如何?
编辑:我注意到从终端运行测试极大地改善了时间。从 XCode 运行会产生更多的波动,我正在使用这些数字来得出我的结论。无论如何,我似乎仍然在同一台机器上的 Windows 7 下获得更稳定的行为。但电流波动在容许要求之内。