我正在计时我的 OpenGL 帧速率,打开垂直同步,并注意我的计时不是显示器设置的精确频率。也就是说,在我的桌面上我有 60Hz 刷新,但 FPS 稳定在 59.88,而在我的平板电脑上它也是 60Hz,但 FPS 可以是 61/62 FPS。我很好奇究竟是什么导致了这些轻微的偏差。
这些是我到目前为止的想法:
- 丢帧:这是显而易见的答案:我只是缺少一些帧。然而,这不是原因,因为我可以验证我没有丢帧,如果发生这种情况,FPS 的下降会更高。我计算了超过 120 帧的时间,因此如果丢失 1 帧,桌面上的 FPS 将降至 59.5 以下。
- 时间不准确:我使用 clock_gettime 来获取我的时间。在 Linux 上,我知道这已经足够准确了(正如我之前使用它进行基于纳秒的计时,但在这里我们甚至可以忍受 +/- 几百微秒)。但是在 Android 上,我不确定这个的准确性。
- API 奇怪:我在桌面上使用 glXSwapBuffers,在 Android 上使用 eglSwapBuffers。这里可能有点奇怪,但我不明白这会如何微妙地影响帧速率。
- 近似赫兹:这是我最大的猜测,显卡/显示器实际上并未以 60Hz 运行。这可能与显示器的确切速度和视频卡频率有关。这似乎可以具体确定,但我不知道可以使用哪些工具来做到这一点。(更新:我当前在 Linux 中的视频模式显示 59.93Hz,如此接近,但仍然不存在)
如果答案确实是#4,那么这可能不是该问题的最佳交换站点。但在所有情况下,我的最终目标是以编程方式找出理想的刷新率实际是多少。所以我希望有人可以确认/否认我的想法,并可能为我指明正确的方向以获取我需要的信息。