我正在尝试编写一个应用程序来全屏显示需要尽可能顺畅的视频。
我的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下获得更稳定的行为。但目前的波动是在容忍的要求范围内。
答案 0 :(得分:0)
如果视口是一个小窗口而不是整个屏幕,那么此测试会发生什么?如果行为与100x100窗口相同,那么您可以认为它不是GPU性能问题。
你在叫GLFinish()吗?如果不是这样,图形驱动程序可以随意将结果输出到屏幕上。结果可能是您观察到的性能峰值。
您使用的计时器的分辨率是多少?我遇到了类似的问题,试图在Windows中对我自己的代码进行基准测试 - 标准的Windows计时器的分辨率很差(~19ms),所以我不得不切换到更高分辨率的计时器。