GDK3/GTK3 window 更新的精确时间

Precision timing of GDK3/GTK3 window update

我有一个使用 GTK 用 C 编写的应用程序(尽管语言对于这个问题可能并不重要)。

此应用程序具有全屏gtk_window 和单个 gtk_drawing_area。对于绘图区域,我已经通过 gtk_widget_add_tick_callback 注册了一个 tick 回调,它只在每次 tick 时调用 gtk_widget_queue_draw。在绘图区域 draw 回调中,我定期更改整个 window 的颜色(例如,以 1Hz 的频率从黑色变为白色)。

假设在这次调用绘制回调中我想将 window 从黑色更改为白色。我想知道实际在屏幕上绘制更改的精确时间(精确到毫秒)(理想情况下与 CLOCK_MONOTONIC 的单位相同)。我不认为这与 tick 回调中可用的 GdkFrameClock 是一回事,据我了解,它是关于帧的时间,而不是帧实际显示在屏幕上的时间.

如果我只是测量绘图回调中的 CLOCK_MONOTONIC 时间,然后使用光电二极管测量实际变化是通过附加的 A2D 进行的,实际变化是显示延迟了可以理解一些刷新间隔(在我的例子中,3 次屏幕刷新)。

总结一下:如果我在 GTK 小部件绘制回调中,有什么方法可以知道显示实际显示在监视器上的时间,单位为 CLOCK_MONOTONIC?或者,有没有一种方法可以阻止一个单独的线程,直到我关心的特定重绘实际显示在屏幕上(我可以像 wait_for_screen_flip() 那样编写一个函数)?

更新:理想情况下,相同的解决方案适用于任何 Linux 合成器(X11 或 Wayland),这就是为什么我希望有一个 GTK/GDK 解决方案,其中合成器被抽象化了。

看看https://cgit.freedesktop.org/xorg/proto/presentproto/tree/presentproto.txt。具体来说,您需要 PresentCompleteNotify 个事件。请注意,这些只能稍后告诉您演示实际发生的时间,所以(我认为)您不会提前知道这是什么时候(但您也许可以根据最近的通知进行猜测?)。

注意这是

  • 一个相对较新的 X11 扩展,因此实际上可能并非所有地方都支持
  • 数据质量取决于所使用的驱动程序(可能还有许多其他因素)
  • 无法在 GTK 中使用,因为它需要不同的方式来显示到屏幕(您绘制到 Pixmap,然后使用 PresentPixmap 使其可见并请求通知)

另请注意,此扩展程序提供了许多其他功能。例如,您可以说 "please display at time "。只需从头到尾阅读协议规范。 :-)

与 Uli 对 Present 扩展和 PresentCompleteNotify for X11 的回答类似,Wayland 有一个类似的协议,称为 wp_presentation_feedback:

https://cgit.freedesktop.org/wayland/wayland-protocols/tree/stable/presentation-time/presentation-time.xml

此协议允许 Wayland 合成器在实际显示内容(变亮)时通知客户端。它独立于实际使用的缓冲机制 (EGL/SHM/etc)。要使用它,请在 wl_surface_commit 之前调用 wp_presentation_get_feedback;提交完成后,presented 事件将从新的 wp_presentation_feedback 对象发送到客户端,或者 discarded 如果它从未显示过。

演示文稿反馈目前已在 Weston 实施;它还没有在 Mutter 中实现,我也不认为它在 KWin 中实现了。 GTK+ 计划在它在 Mutter 中可用时支持它,但我对它如何通过 GTK+ 公开没有任何深刻见解 API.

也就是说,如果您可以访问 Wayland 显示,您可能可以自己直接使用该界面。

我刚刚遇到 https://developer.gnome.org/gdk3/stable/gdk3-GdkFrameTimings.html#gdk-frame-timings-get-presentation-time which seems to do just like what you want and is part of Gdk. I do not know how to use it nor have I seen some example of it, but https://developer.gnome.org/gdk3/stable/gdk3-GdkFrameTimings.html#gdk3-GdkFrameTimings.description

The information in GdkFrameTimings is useful for precise synchronization of video with the event or audio streams, and for measuring quality metrics for the application’s display, such as latency and jitter.