你怎么知道你所展示的内容完全画在屏幕上?

时间:2013-11-04 16:50:47

标签: opengl screen swap framebuffer vsync

在计算机显示器上显示图像涉及使用图形API,它会调度一系列异步调用......并且在某个给定时间,将所需内容放在计算机屏幕上。

但是,如果您有兴趣了解所需图像完全绘制(并且对用户可见)的 完全 CPU时间,该怎么办?

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

如果不考虑图形堆栈的异步行为,很多事情都会导致图形调用抖动的长度:

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

我在Linux上定位解决方案,但我对任何其他操作系统都开放。我已经为X.org服务器和OpenGL API研究了xvideo extension的部分内容,但我还没有找到有效的解决方案。

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

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


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

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

1 个答案:

答案 0 :(得分:3)

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