代码之家  ›  专栏  ›  技术社区  ›  David

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

  •  2
  • David  · 技术社区  · 7 年前

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

    此应用程序具有全屏 gtk_window 用一个 gtk_drawing_area . 对于绘图区域,我通过以下方式注册了勾号回调 gtk_widget_add_tick_callback 只是打电话 gtk_widget_queue_draw 每个滴答声。绘图区域内 draw 回调时,我会定期更改整个窗口的颜色(例如,在1Hz时从黑色变为白色)。

    假设在这个对draw回调的调用中,我想将窗口从黑色更改为白色。我想知道屏幕上实际绘制变化的精确时间(精确到毫秒)(理想情况下,单位与 CLOCK_MONOTONIC ). 我认为这和 GdkFrameClock 在tick回调中可用,据我所知,它是关于帧的时间,而不是帧实际显示在屏幕上的时间。

    如果我只测量 CLOCK\u单调 图形回调中的时间,然后使用光电二极管测量实际更改是通过附加的A2D进行的,实际更改是显示延迟了许多刷新间隔(在我的情况下,3次屏幕刷新),这是可以理解的。

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

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

    3 回复  |  直到 7 年前
        1
  •  1
  •   Daniel Stone    7 年前

    与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\u presentation\u反馈 反对,或 discarded 如果它从未展示过。

    威斯顿目前正在实施演示反馈;它还没有在Mutter中实现,我也不相信它在KWin中实现。GTK+计划在Mutter中提供时支持它,但我对如何通过GTK+API公开它没有太大的见解。

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

        2
  •  0
  •   Uli Schlachter    7 年前

    我只是偶然发现 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中的信息对于视频与事件或音频流的精确同步以及测量应用程序显示的质量指标(如延迟和抖动)非常有用。

        3
  •  0
  •   Uli Schlachter    7 年前

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

    请注意,这是

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

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