4

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

我的 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 下获得更稳定的行为。但电流波动在容许要求之内。

4

1 回答 1

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

  2. 你在打电话给 GLFinish() 吗?如果不是这样,图形驱动程序几乎可以随时将结果自由地输出到屏幕上。结果可能是您观察到的性能峰值。

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

于 2012-11-11T06:14:38.983 回答