可以在OS X中全屏使用OpenGL实现60hz的稳定帧速率吗?

时间:2012-10-30 13:09:47

标签: macos opengl vsync

我正在尝试编写一个应用程序来全屏显示需要尽可能顺畅的视频。

我的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上运行。

切换显卡(这台笔记本电脑配有Nvidia 9600和9400),从外接显示器或笔记本电脑屏幕运行没有任何区别。

为了排除底层API之间的差异,我使用SDL,Glfw,Cinder和SFML等图形框架尝试了相同的代码。最后我还尝试了正式的Apple OpenGL全屏示例。尽管Glfw看起来有点稳定,但它们的行为大致相同。

使用SCHED_FIFO策略将绘图线程优先级提高到最大值似乎可以改善一点,但不是很多。

我开始认为不可能从OpenGL获得稳定的60hz帧速率,或者如果它没有正确记录。

有没有人能够在OS X中为全屏OpenGL应用程序获得稳定的60hz显示速率? 怎么样?

编辑:我注意到从终端运行测试可以改善时间安排。从XCode运行产生更多波动,我使用这些数字得出我的结论。在任何情况下,我似乎仍然在同一台机器上的Windows 7下获得更稳定的行为。但目前的波动是在容忍的要求范围内。

1 个答案:

答案 0 :(得分:0)

  1. 如果视口是一个小窗口而不是整个屏幕,那么此测试会发生什么?如果行为与100x100窗口相同,那么您可以认为它不是GPU性能问题。

  2. 你在叫GLFinish()吗?如果不是这样,图形驱动程序可以随意将结果输出到屏幕上。结果可能是您观察到的性能峰值。

  3. 您使用的计时器的分辨率是多少?我遇到了类似的问题,试图在Windows中对我自己的代码进行基准测试 - 标准的Windows计时器的分辨率很差(~19ms),所以我不得不切换到更高分辨率的计时器。