3

在计算机显示器上显示图像涉及到图形 API 的使用,该 API 调度一系列异步调用......并在某个给定时间将所需的东西放在计算机屏幕上。

但是,如果您想知道在所需图像被完全绘制(并且对用户可见)时的确切CPU 时间怎么办?

当显示所有内容时,我真的需要获取 CPU 时间戳,以便将该时间点与我进行的其他测量相关联。

在不考虑图形堆栈的异步行为的情况下,很多事情都可以得到图形调用抖动的长度:

  • 多线程;
  • 同步到 V-BLANK(不幸的是,需要避免一些撕裂);
  • 我还忘记了什么?:P

我针对 Linux 上的解决方案,但我对任何其他操作系统持开放态度。我已经研究了 X.org 服务器的部分xvideo 扩展和 OpenGL API,但我还没有找到有效的解决方案。

我只希望解决方案不涉及入侵视频驱动程序/硬件!

注意:我将无法在所需硬件上使用最近的 Nvidia G-SYNC 东西。虽然,这项技术会消除一些不可预测的抖动,但我认为它并不能完全解决这个问题。


OpenGL Wiki建议如下:“如果需要 GPU<->CPU 同步,则应在缓冲区交换后使用高精度/多媒体计时器而不是 glFinish。”

有人知道在 GPU 队列中的 swapBuffer 调用完成后如何正确地获取这样一个高精度/多媒体计时器值吗?

4

1 回答 1

3

最近的 OpenGL 提供了同步/栅栏对象。您可以将同步对象放在 OpenGL 命令流中,然后等待它们通过。见http://www.opengl.org/wiki/Sync_Object

于 2013-11-04T19:14:52.233 回答