GDK3 / GTK3窗口更新的精确计时

时间:2018-01-24 14:01:45

标签: c gtk3 timing cairo gdk

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

此应用程序的全屏gtk_window只有一个gtk_drawing_area。对于绘图区域,我已通过gtk_widget_add_tick_callback注册了一个勾选回调,每次勾选时都会调用gtk_widget_queue_draw。在绘图区域内draw回调,我定期更改整个窗口的颜色(例如,以1Hz从黑色变为白色)。

假设在这次调用回调中我想将窗口从黑色更改为白色。我想知道实际在屏幕上绘制更改的精确时间(最小到最接近的ms)(理想情况下与CLOCK_MONOTONIC相同)。我不认为这与tick回调中可用的GdkFrameClock相同,据我所知,它是关于帧的时间,而不是帧实际显示在屏幕上的时间。

如果我只是测量绘图回调中的CLOCK_MONOTONIC时间,然后使用光电二极管来测量实际更改是通过附加的A2D,实际的变化是显示可以理解地延迟了一个数字刷新间隔(在我的情况下,3个屏幕刷新)。

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

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

3 个答案:

答案 0 :(得分:1)

与Uli对当前扩展的回答和与X11的PresentCompleteNotify类似,Wayland有一个名为wp_presentation_feedback的类似协议:

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

此协议允许Wayland合成器在客户的内容实际显示(转向灯光)时通知客户。它与使用的实际缓冲机制(EGL / SHM / etc)无关。要使用它,请在wp_presentation_get_feedback之前致电wl_surface_commit;提交完成后,presented事件将从新wp_presentation_feedback对象发送到客户端,如果从未显示,则发送discarded

介绍反馈目前在Weston实施;它还没有在Mutter中实现,我也不相信它在KWin中实现了。 GTK +计划在Mutter推出时支持它,但我对如何通过GTK + API公开它没有任何了解。

话虽如此,如果您可以访问Wayland显示器,您可以直接使用该界面。

答案 1 :(得分:0)

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

请注意,这是

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

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

答案 2 :(得分:0)

我刚遇到https://developer.gnome.org/gdk3/stable/gdk3-GdkFrameTimings.html#gdk-frame-timings-get-presentation-time这似乎就像你想要的那样,并且是Gdk的一部分。我不知道如何使用它,也没有看到它的一些例子,但https://developer.gnome.org/gdk3/stable/gdk3-GdkFrameTimings.html#gdk3-GdkFrameTimings.description

  

GdkFrameTimings中的信息对于视频与事件或音频流的精确同步以及测量应用程序显示的质量指标(如延迟和抖动)非常有用。

相关问题