读取 Xorg 或 DRM 帧缓冲区的低延迟方法

读取 Xorg 或 DRM 帧缓冲区的低延迟方法

我正在尝试构建一个可以测量 Linux 上图形框架的延迟/处理时间的应用程序。我的想法是通过使用不同的图形和 UI 框架(例如 SDL、OpenGL、Qt...)更改屏幕颜色(例如从黑色变为白色)来实现对输入事件(例如鼠标单击)做出反应的简单程序。为了测量每个程序的延迟,我想实现一个单独的程序,该程序测量从输入事件到达机器(我使用 evdev )到在某种帧缓冲区中更新像素(尽可能接近应用程序)的时间尽可能)。第二个程序也应该独立于 vblank 事件,因为我感兴趣的是渲染完成的时间,而不是用户可能能够看到某些内容的时间。

我的问题是使用第二个程序获取帧缓冲区内容。我已经设法使用 fbdev 或 libdrm 获取帧缓冲区内容(基于本教程),但两者都要求程序在没有活动 XServer 的终端中运行(由于外部有效性,我更喜欢这种方式)。我也已经尝试过使用麻省理工学院XShm检索 X 帧缓冲区的内容,但对于我的问题来说,即使只读取一个像素(大约 4 毫秒,有严重的异常值),它似乎也太慢了。

这就是我目前使用 XShm 的方式,以防有帮助。

// get one pixel at coordinates x/y with XShm
XShmGetImage(display, rootWindow, image, x, y, 0x00ffffff);

// store red value into variable
unsigned int color = image->data[2];

if(color != lastcolor)
{
    log(time_micros(), color);
}

是否有一种快速可靠的方法可以在 XServer 运行时检索帧缓冲区内容(从 X 或从 DRM)?或者 XShm 是我们目前能做的最好的事情吗?

相关内容